我正在使用swift构建一个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调用

请帮助我理解手势识别器的行为。一个工作样例代码将是一个很大的帮助。

谢谢。


当前回答

这就是我如何使用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()
}

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

其他回答

拉动刷新是iOS内置的。你可以像这样快速完成

let refreshControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
   tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
}

在某些时候,你可能会停止刷新。

refreshControl.endRefreshing()

对于拉刷新,我正在使用

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

安装

豆荚的DGElasticPullToRefresh

import DGElasticPullToRefresh

然后把这个函数放到你的swift文件中,然后从你的

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

 }

看起来就像

快乐编码:)

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

我建议你再读一遍Swift的介绍文档,里面详细地介绍了这一点。

最后,正如@Anil指出的,iOS中有一个内置的名为UIRefresControl的拉刷新控件,这可能是值得研究的东西。

使用storyboard和Swift的解决方案:

Open your .storyboard file, select a TableViewController in your storyboard and "Enable" the Table View Controller: Refreshing feature in the Utilities. Open the associated UITableViewController class and add the following Swift 5 line into the viewDidLoad method. self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged) Add the following method above the viewDidLoad method func refresh(sender:AnyObject) { // Updating your data here... self.tableView.reloadData() self.refreshControl?.endRefreshing() }

您可以通过使用几行代码来实现这一点。所以为什么你会困在第三方库或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  
}