Swift에서 pull을 사용하여 새로 고치는 방법은 무엇입니까?
스위프트를 사용하여 RSS 리더를 작성 중이며 끌어서 다시로드 기능을 구현해야합니다.
여기 내가 그것을하려고하는 방법이 있습니다.
class FirstViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource {
@IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
@IBOutlet var newsCollect: UITableView
var activityIndicator:UIActivityIndicatorView? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.newsCollect.scrollEnabled = true
// Do any additional setup after loading the view, typically from a nib.
if nCollect.news.count <= 2{
self.collectNews()
}
else{
self.removeActivityIndicator()
}
view.addGestureRecognizer(refresh)
}
@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
nCollect.news = News[]()
return newsCollect.reloadData()
}
나는 얻고있다 :
super.init 호출시 'self.refresh'속성이 초기화되지 않았습니다.
제스처 인식기의 동작을 이해하도록 도와주세요. 작동하는 샘플 코드는 큰 도움이 될 것입니다.
감사.
iOS에 내장 된 새로 고침 기능 이 내장되어 있습니다. 당신은 신속하게 이렇게 할 수 있습니다
var refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControl.Event.valueChanged)
tableView.addSubview(refreshControl) // not required when using UITableViewController
}
@objc func refresh(sender:AnyObject) {
// Code to refresh table view
}
어느 시점에서 당신은 상쾌하게 끝낼 수 있습니다.
refreshControl.endRefreshing()
스토리 보드와 신속한 솔루션 ...
1.) .storyboard 파일을 열고 스토리 보드에서 TableViewController를 선택한 다음 유틸리티에서 Table View Controller-Refreshing 기능을 "활성화"하십시오.
2.) 연결된 UITableViewController-Class를 열고 viewDidLoad-Method에 다음 줄을 추가하십시오.
self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
스위프트 5.0 편집 :
self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
또는 Swift 2.2의 경우 :
self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
3.) viewDidLoad-Method 위에 다음 메소드를 추가하십시오.
func refresh(sender:AnyObject)
{
// Updating your data here...
self.tableView.reloadData()
self.refreshControl?.endRefreshing()
}
iOS 10-Swift 3 (iOS 11에도 적용 가능-Swift 4)
iOS 10부터 포함 된 PRETTY COOL 기능 에 대해 언급하고 싶습니다 .
지금은 UIRefreshControl는 직접 각 지원됩니다 UICollectionView
, UITableView
와 UIScrollView
!
이러한 각 뷰에는 refreshControl 인스턴스 속성이 있습니다. 즉, 더 이상 스크롤 뷰에서 하위 뷰로 추가 할 필요가 없습니다 .
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)
// this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
collectionView.refreshControl = refreshControl
}
func doSomething(refreshControl: UIRefreshControl) {
print("Hello World!")
// somewhere in your code you might need to call:
refreshControl.endRefreshing()
}
개인적으로, 하위 뷰로 추가하는 것보다 스크롤 뷰의 속성으로 처리하는 것이 더 자연 스럽습니다. 특히 UIRefreshControl의 슈퍼 뷰로 적합한 뷰는 스크롤 뷰뿐입니다. 즉 UIRefreshControl을 사용하는 기능은 스크롤보기로 작업 할 때 유용합니다. 이것이 바로이 접근 방식이 새로 고침 제어보기를 설정하는 것이 더 분명한 이유입니다.
그러나 여전히 addSubview
iOS 버전 기반 의 옵션을 사용할 수 있습니다 .
if #available(iOS 10.0, *) {
collectionView.refreshControl = refreshControl
} else {
collectionView.addSubview(refreshControl)
}
스위프트 4
var refreshControl: UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
tableView.addSubview(refreshControl)
}
@objc func refresh(_ sender: Any) {
// your code to reload tableView
}
그리고 다음과 같이 새로 고침을 중지 할 수 있습니다.
refreshControl.endRefreshing()
에서 스위프트 이것을 사용,
WebView에서 풀을 새로 고치려면
따라서이 코드를 사용해보십시오 :
override func viewDidLoad() {
super.viewDidLoad()
addPullToRefreshToWebView()
}
func addPullToRefreshToWebView(){
var refreshController:UIRefreshControl = UIRefreshControl()
refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
YourWebView.scrollView.addSubview(refreshController)
}
func refreshWebView(refresh:UIRefreshControl){
YourWebView.reload()
refresh.endRefreshing()
}
Anhil의 대답은 저에게 많은 도움이되었습니다.
그러나 추가 실험을 통해 제안 된 솔루션이 때로는 UI 결함을 유발하는 것으로 나타났습니다 .
대신, 이 접근 방식을 택하면 나를 위해 속임수를 쓸 수있었습니다.
스위프트 2.1
//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()
//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl
오류가 알려주 refresh
는 것은 초기화되지 않았다는 것입니다. 당신이 만드는 것을 선택하는 것이 주 refresh
는 것을 스위프트 수단에있는 선택하지 가 문의하기 전에 값을 가지고 super.init
(또는 암시 적 사건으로 보인다,라고). 어느 만드는 refresh
옵션 (당신이 원하는 아마 무엇을) 또는 그것을 어떤 방법으로 초기화합니다.
Swift 소개 문서를 다시 읽으십시오.
@Anil이 지적한 것처럼 대답의 일부가 아닌 마지막 한 가지는 iOS라는 컨트롤을 새로 고치기 위해 내장되어 UIRefresControl
있습니다.
원래 위에 나열된 몇 가지 문제 가있는 Pull To Refresh 기능이 있는 RSS 피드 앱을 만들었 습니다.
그러나 위의 사용자 답변에 추가하기 위해 유스 케이스를 어디에서나 찾았으며 찾을 수 없었습니다. 웹 (RSSFeed)에서 데이터를 다운로드하고 있었고 테이블의 스토리를 풀다운하여 새로 고치기를 원했습니다.
위에서 언급 한 것은 올바른 영역을 다루지 만 사람들이 겪고있는 몇 가지 문제와 함께 여기 내가 한 일이 있으며 치료를합니다.
@Blankarsch의 접근 방식을 취하고 내 main.storyboard로 이동하여 새로 고침을 사용할 테이블보기를 선택한 다음 언급되지 않은 것은 새로 고침을 효율적으로 사용하기 위해 IBOutlet 및 IBAction을 만드는 것입니다.
//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl
override func viewDidLoad() {
......
......
//Include your code
......
......
//Is the function called below, make sure to put this in your viewDidLoad
//method or not data will be visible when running the app
getFeedData()
}
//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
.....
.....
}
//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and
//make sure arguments are set to none and note sender
@IBAction func refresh() {
//getting our data by calling the function which gets our data/parse our data
getFeedData()
//note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
refreshControl?.endRefreshing()
}
희망이 나와 같은 상황에있는 사람에게 도움이되기를 바랍니다.
func pullToRefresh(){
let refresh = UIRefreshControl()
refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
refresh.tintColor = UIColor.appBlack
self.tblAddressBook.addSubview(refresh)
}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
self.callAddressBookListApi(isLoaderRequired: false)
sender.endRefreshing()
}
모든 클래스에서 사용할 수 있도록 Pull To Refresh 확장을 만드는 것이 좋습니다.
1) 빈 빠른 파일을 만듭니다 : File-New-File-Swift File.
2) 다음을 추가하십시오
// AppExtensions.swift
import Foundation
import UIKit
var tableRefreshControl:UIRefreshControl = UIRefreshControl()
//MARK:- VIEWCONTROLLER EXTENSION METHODS
public extension UIViewController
{
func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){
tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
tableRefreshControl.backgroundColor = UIColor.whiteColor()
tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
tableName.addSubview(tableRefreshControl)
}
func makePullToRefreshEndRefreshing (tableName: String)
{
tableRefreshControl.endRefreshing()
//additional codes
}
}
3) View Controller에서이 메소드를 다음과 같이 호출하십시오.
override func viewWillAppear(animated: Bool) {
self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}
4) 어느 시점에서 새로 고침을 끝내고 싶었습니다.
func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")
//Code What to do here.
}
OR
self.makePullToRefreshEndRefreshing("bidderListTable")
풀을 새로 고치려면 사용하고 있습니다.
DGElasticPullToRefresh
https://github.com/gontovnik/DGElasticPullToRefresh
설치
포드 'DGElasticPullToRefresh'
import DGElasticPullToRefresh
이 기능을 빠른 파일에 넣고이 기능을
func view 재정의 (WillAppear (_ animated : Bool)
func Refresher() {
let loadingView = DGElasticPullToRefreshLoadingViewCircle()
loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in
//Completion block you can perfrom your code here.
print("Stack Overflow")
self?.table.dg_stopLoading()
}, loadingView: loadingView)
self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
}
뷰가 사라지는 동안 참조를 제거하는 것을 잊지 마십시오.
풀을 제거하려면이 코드를
func view 재정의 (DidDisappear (_ animated : Bool)
override func viewDidDisappear(_ animated: Bool) {
table.dg_removePullToRefresh()
}
그리고 그것은 보일 것입니다
행복한 코딩 :)
세부
- Xcode 버전 10.3 (10G8), 스위프트 5
풍모
- 프로그래밍 방식으로 "새로 고침"을 수행하는 기능
- 다중 "풀에서 리프레시"이벤트로부터 보호
- 뷰 컨트롤러가 전환 될 때 (예 : TabController의 경우) 활동 표시기 애니메이션을 계속 애니메이션 할 수있는 기능
해결책
import UIKit
class RefreshControl: UIRefreshControl {
private weak var actionTarget: AnyObject?
private var actionSelector: Selector?
override init() { super.init() }
convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
self.init()
self.actionTarget = actionTarget
self.actionSelector = actionSelector
addTarget()
}
private func addTarget() {
guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
addTarget(actionTarget, action: actionSelector, for: .valueChanged)
}
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
func endRefreshing(deadline: DispatchTime? = nil) {
guard let deadline = deadline else { endRefreshing(); return }
DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
DispatchQueue.main.async { self?.endRefreshing() }
}
}
func refreshActivityIndicatorView() {
guard let selector = actionSelector else { return }
let _isRefreshing = isRefreshing
removeTarget(actionTarget, action: selector, for: .valueChanged)
endRefreshing()
if _isRefreshing { beginRefreshing() }
addTarget()
}
func generateRefreshEvent() {
beginRefreshing()
sendActions(for: .valueChanged)
}
}
public extension UIScrollView {
private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }
func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
if !replaceIfExist && refreshControl != nil { return }
refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
}
func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
_refreshControl?.refreshActivityIndicatorView()
guard let refreshControl = refreshControl,
contentOffset.y != -refreshControl.frame.height else { return }
setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
}
private var canStartRefreshing: Bool {
guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
return true
}
func startRefreshing() {
guard canStartRefreshing else { return }
_refreshControl?.generateRefreshEvent()
}
func pullAndRefresh() {
guard canStartRefreshing else { return }
scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
_refreshControl?.generateRefreshEvent()
}
func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}
용법
// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
let tableView = UITableView()
// ...
tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}
@objc func refreshData(_ refreshControl: UIRefreshControl) {
tableView?.endRefreshing(deadline: .now() + .seconds(3))
}
// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()
// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()
전체 샘플
여기에 솔루션 코드 를 추가하는 것을 잊지 마십시오
import UIKit
class ViewController: UIViewController {
private weak var tableView: UITableView?
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
}
private func setupTableView() {
let tableView = UITableView()
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
tableView.dataSource = self
tableView.delegate = self
tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
self.tableView = tableView
}
}
extension ViewController {
@objc func refreshData(_ refreshControl: UIRefreshControl) {
print("refreshing")
tableView?.endRefreshing(deadline: .now() + .seconds(3))
}
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int { return 1 }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "\(indexPath)"
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.pullAndRefresh()
}
}
이 tableView 서브 클래스를 사용할 수 있습니다 :
import UIKit
protocol PullToRefreshTableViewDelegate : class {
func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}
class PullToRefreshTableView: UITableView {
@IBOutlet weak var pullToRefreshDelegate: AnyObject?
private var refreshControl: UIRefreshControl!
private var isFirstLoad = true
override func willMoveToSuperview(newSuperview: UIView?) {
super.willMoveToSuperview(newSuperview)
if (isFirstLoad) {
addRefreshControl()
isFirstLoad = false
}
}
private func addRefreshControl() {
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
self.addSubview(refreshControl)
}
@objc private func refresh() {
(pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
}
func endRefreshing() {
refreshControl.endRefreshing()
}
}
1-인터페이스 빌더에서 tableView 클래스를 프로그래밍 방식으로 변경 PullToRefreshTableView
하거나 PullToRefreshTableView
프로그래밍 방식으로 작성하십시오.
2- PullToRefreshTableViewDelegate
뷰 컨트롤러에서 구현
3- tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
테이블 뷰 새로 고침이 시작되면 뷰 컨트롤러에서 호출됩니다.
4- yourTableView.endRefreshing()
상쾌하게하기 위해 전화
이것이 내가 Xcode 7.2를 사용하여 작동하게 만드는 방법이며 주요 버그라고 생각합니다. 나는 내 UITableViewController
안에 그것을 사용하고 있습니다viewWillAppear
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()
configureMessages()
func configureMessages() {
// configuring messages logic here
self.refreshControl!.endRefreshing()
}
보시다시피 문자 그대로 그다음에 configureMessage()
설정 UIRefreshControl
한 후 메소드 를 호출 해야하며 후속 새로 고침이 정상적으로 작동합니다.
몇 줄의 코드를 사용하여이를 달성 할 수 있습니다. 왜 타사 라이브러리 또는 UI에 갇히게됩니까? iOS에 내장 된 새로 고침 기능이 내장되어 있습니다. 당신은 신속하게 이렇게 할 수 있습니다
var pullControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
tableView.addSubview(pullControl) // not required when using UITableViewController
}
@objc func pulledRefreshControl(sender:AnyObject) {
// Code to refresh table view
}
다른 답변은 정확하지만 자세한 내용은이 게시물을 확인 하여 새로 고침
스토리 보드에서 새로 고침 사용
UITableViewController로 작업 할 때 솔루션은 매우 간단합니다. 먼저 스토리 보드에서 테이블 뷰 컨트롤러를 선택하고 속성 관리자를 열고 새로 고침을 활성화하십시오.
UITableViewController에는 UIRefreshControl에 대한 참조가 기본 제공됩니다. 사용자가 풀다운 할 때 새로 고침을 시작하고 완료하려면 몇 가지 사항 만 연결하면됩니다.
viewDidLoad () 재정의
viewDidLoad ()를 재정의 할 때 다음과 같이 새로 고침을 처리 할 대상을 추가하십시오.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
- “handleRefresh :”(콜론에주의하십시오!)을 액션 인수로 지정 했으므로이 UITableViewController 클래스에서 같은 이름으로 함수를 정의해야합니다. 또한 함수는 하나의 인수를 취해야합니다.
- ValueChanged라는 UIControlEvent에 대해이 조치를 호출하려고합니다.
- 전화하는 것을 잊지 마세요
refreshControl.endRefreshing()
자세한 내용은 링크를 참조하십시오 모든 링크는 해당 게시물로 이동
참고 URL : https://stackoverflow.com/questions/24475792/how-to-use-pull-to-refresh-in-swift
'Programing' 카테고리의 다른 글
DROP 데이터베이스 권한없이 명령 행에서 모든 MySQL 테이블을 제거하는 방법은 무엇입니까? (0) | 2020.04.29 |
---|---|
PostgreSQL에서 인덱스가있는 열 나열 (0) | 2020.04.29 |
-XAllowAmbiguousTypes는 언제 적절한가요? (0) | 2020.04.29 |
폭탄 적하 알고리즘 (0) | 2020.04.29 |
Expressjs에서 미들웨어 및 app.use는 실제로 무엇을 의미합니까? (0) | 2020.04.29 |