如何使用拉来刷新Swift?

我正在使用swift构build一个RSS阅读器,并需要实现拉来重新加载function。

这是我如何做到这一点。

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() } 

我正进入(状态 :

属性'self.refresh'在super.init调用时未初始化

请帮助我了解手势识别器的行为。 一个有效的示例代码将是一个很大的帮助。

谢谢。

拉到刷新是build立在iOS。 你可以像这样迅速做到这一点

 var refreshControl: UIRefreshControl! override func viewDidLoad() { super.viewDidLoad() refreshControl = UIRefreshControl() refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) tableView.addSubview(refreshControl) // not required when using UITableViewController } func refresh(sender:AnyObject) { // Code to refresh table view } 

在某个时候,你可以结束令人耳目一新。

 refreshControl.endRefreshing() 

与故事板和迅速解决scheme…

1.)打开您的.storyboard文件,在故事板中select一个TableViewController,并在实用工具中启用“表格视图控制器 – 刷新”function。

在这里输入图像描述

2.)打开关联的UITableViewController-Class并将下面一行添加到viewDidLoad-Method中。

 self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 

OR在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 COOLfunction,它是:

现在,在UICollectionViewUITableViewUIScrollView直接支持UICollectionView

这些视图中的每一个视图都有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的function是唯一的使用滚动视图时很有用; 这就是为什么这种方法应该更明显地设置刷新控制视图。

Swift 3

 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) } func refresh(_ sender: Any) { // your code to refresh tableView } 

而你可以停止刷新:

 refreshControl.endRefreshing() 

Anhil的回答帮了我很多。

但是,经过进一步的实验,我发现解决schemebuild议有时会导致一个不那么漂亮的UI故障 。

相反,去这个方法 *为我做了诡计。

* Swift 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 

Swift中使用这个,

如果你想在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() } 

错误告诉你的是refresh没有初始化。 请注意,你selectrefresh不是可选的,这在Swift中意味着在调用super.init之前它必须有一个值(或者是隐式调用,这似乎是你的情况)。 要么refresh可选(可能是你想要的)或以某种方式初始化它。

我build议再次阅读Swift介绍性文档,其中涵盖了很多。

最后,不是答案的一部分,正如@Anil指出的那样,在iOS中有一个内置的拉取控件,叫做UIRefresControl ,这可能是值得研究的东西。

我build立了一个RSS提要应用程序,其中我有一个拉来刷新function,最初有一些上面列出的问题。

但是为了给用户增加上面的答案,我到处寻找我的用例并找不到它。 我正在从网上下载数据(RSSFeed),我想拉下我的tableView的故事刷新。

上面提到的内容涵盖了正确的领域,但也带来了一些人们遇到的问题,这就是我所做的,

我采取了@Blankarsch的方法,并去我的main.storyboard和select表视图使用刷新,那么没有提到的是创buildIBOutlet和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() } 

我build议做一个拉到刷新的扩展在每个类中使用。

1)制作一个空的swift文件: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)在您的视图控制器调用这些方法为:

  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") 

你可以使用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或以编程方式创buildPullToRefreshTableView

2 – 在视图控制器中实现PullToRefreshTableViewDelegate

3 – tableViewDidStartRefreshing(tableView: PullToRefreshTableView)将在您的视图控制器在表视图开始刷新时调用

4 – 调用yourTableView.endRefreshing()完成刷新

这是我如何使用Xcode 7.2,我认为是一个主要的错误。 我在我的viewWillAppear里面的UITableViewController使用它

 refreshControl = UIRefreshControl() refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged) refreshControl!.beginRefreshing() configureMessages() func configureMessages() { // configuring messages logic here self.refreshControl!.endRefreshing() } 

正如你所看到的,在设置我的UIRefreshControl之后,我实际上必须调用configureMessage()方法,之后的刷新将正常工作。

为了拉我刷新使用

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

安装

荚'DGElasticPullToRefresh'

 import DGElasticPullToRefresh 

并把这个函数放到你的swift文件中,并从你的这个函数中调用

覆盖func viewWillAppear(_ 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 viewDidDisappear(_ animated:Bool)

 override func viewDidDisappear(_ animated: Bool) { table.dg_removePullToRefresh() } 

它会看起来像

在这里输入图像描述

快乐编码:)

其他答案是正确的,但更详细的检查这个职位拉刷新

在Storyboard中启用刷新

在使用UITableViewController时,解决scheme非常简单:首先,在故事板中select表视图控制器,打开属性检查器并启用刷新:

一个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) } 
  1. 由于我已经指定了“handleRefresh:”(注意冒号!)作为动作参数,我需要在这个UITableViewController类中定义一个具有相同名称的函数。 另外,该函数应该有一个参数
  2. 我们希望这个动作被称为ValueChanged的UIControlEvent
  3. 不要忘记调用refreshControl.endRefreshing()

欲了解更多信息请去链接和所有功劳去那个职位