在 ViewController 的 UICollectionView 中拉取刷新

Posted

技术标签:

【中文标题】在 ViewController 的 UICollectionView 中拉取刷新【英文标题】:Pull to refresh in UICollectionView in ViewController 【发布时间】:2016-02-12 12:15:31 【问题描述】:

我在UICollectionViewController使用了以下代码

override func viewDidLoad()             

    self.collectionView!.alwaysBounceVertical = true
    let refresher = UIRefreshControl()
    refresher.addTarget(self, action: "refreshStream", forControlEvents: .ValueChanged)

    refreshControl = refresher
    collectionView!.addSubview(refreshControl!)


func refreshStream() 

    print("refresh")
    self.collectionView?.reloadData()

    refreshControl?.endRefreshing()


现在我需要它与 UICollectionView 内的 UIViewController 一起工作,我现在用谷歌搜索了一个小时,但无法让它工作。 感谢您的帮助。

【问题讨论】:

不行吗? ***.com/questions/14678727/… 主要代码是objective c,swift cmets给我带来了很多问题: 使用未解析的标识符“Const” 对成员“collectionView”的模糊引用 这个错误表明collectionview不是当前类中的成员类,所以在视图didload self.collectionView.registerNib(UINib(nibName: "xxxx", bundle: NSBundle.mainBundle()), forCellWithReuseIdentifier: "xxxx") 【参考方案1】:

在调用动作方法中更改了新的 swift 代码,您可以像这样重写

@IBOutlet weak var collectionView: UICollectionView!

var refresher:UIRefreshControl!

override func viewDidLoad() 

   super.viewDidLoad()

    self.refresher = UIRefreshControl()
    self.collectionView!.alwaysBounceVertical = true
    self.refresher.tintColor = UIColor.red
    self.refresher.addTarget(self, action: #selector(loadData), for: .valueChanged)
    self.collectionView!.addSubview(refresher)


func loadData() 
   self.collectionView!.refreshControl.beginRefreshing()
   //code to execute during refresher
       .
       .
       .
   stopRefresher()         //Call this to stop refresher
 

func stopRefresher() 
   self.collectionView!.refreshControl.endRefreshing()
 

【讨论】:

谢谢,但是“var refreshControl:UIRefreshControl!”需要更改为“var refresher:UIRefreshControl!” 而不是addSubview(refresher),将此刷新添加到集合的swift3方法是:self.collectionView!.refreshControl = refresher self.collectionView!.refreshControl.beginRefreshing() self.collectionView!.refreshControl.endRefreshing() @KingChintz collectionView.refreshControl 仅适用于 ios10。 addSubview 适用于更多版本。 let refresher = UIRefreshControl() 只为viewDidLoad 创建UIRefreshControl 的本地实例吗?不应该是self.refresher = UIRefreshControl() 原样的代码不会正确运行stopRefresher【参考方案2】:
var refreshControl:UIRefreshControl!

override func viewDidLoad() 
    super.viewDidLoad()
      self.refreshControl = UIRefreshControl()
      self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
     self.refreshControl.addTarget(self, action: #selector(PricingPlansCollectionViewController.reload), for: .valueChanged)
      collectionView!.addSubview(refreshControl)


 func refresh(sender:AnyObject)
  
    //DO 
  

【讨论】:

您的代码希望我在“ValueChanged) collectionView!”之间添加一个分号。 ----> 一行中的连续语句必须用';'分隔 您应该将刷新控件对象设置为您的 collectionView per the docs 的 refreshControl 属性【参考方案3】:

Swift 5 解决方案

正如@fishspy 已经提到的,这是将集合视图放入视图控制器的方法,但我还将分享如何以更简洁的方式将刷新控件连接到集合视图。

从 iOS 10 开始,刷新控件有了一个专用属性。除此之外,我还建议直接将刷新控件初始化为属性,将其声明为私有并执行以下操作:

@IBOutlet private weak var collectionView: UICollectionView!

private let refreshControl = UIRefreshControl()

override func viewDidLoad() 

    super.viewDidLoad()

    refreshControl.addTarget(self, action: #selector(didPullToRefresh(_:)), for: .valueChanged)
    collectionView.alwaysBounceVertical = true
    collectionView.refreshControl = refreshControl // iOS 10+


@objc
private func didPullToRefresh(_ sender: Any) 
    // Do you your api calls in here, and then asynchronously remember to stop the
    // refreshing when you've got a result (either positive or negative)
    refreshControl.endRefreshing()

【讨论】:

老实说,我从未见过水平下拉刷新,所以据我所知没有 对于任何需要这个的人,我在这里找到了答案:***.com/questions/56614319/…【参考方案4】:

在情节提要中,您需要使用 Ctrl + Drag 从集合视图对象中将集合视图链接到适当的控制器文件。它需要通过@IBOutlet 链接。

此外,您应该 Ctrl + 从集合视图拖动到情节提要上的视图控制器对象并选择数据源和委托,以便正确链接集合视图。

如果这有帮助或者我误解了你的情况,请告诉我。

【讨论】:

见鬼!谢谢你的朋友。出口点它。谢谢!【参考方案5】:

对我来说,我有:

func setupCollectionView()
      self.refreshControl = UIRefreshControl()
      self.refreshControl.attributedTitle = NSAttributedString(string: "Refreshing content...")
      self.refreshControl.addTarget(self, action: #selector(self.reload), for: .valueChanged)
      collectionView!.addSubview(refreshControl)

它仍然无法正常工作(我相信我有限制以某种方式阻止它),所以我补充说:

collectionView.alwaysBounceVertical = true

然后一切都很好。以防其他人面临同样的问题。

为了更好的理解,完整的实现

@IBOutlet private weak var collectionView: UICollectionView!
let refreshControl = UIRefreshControl()

override func viewDidLoad() 
 super.viewDidLoad()
 setupCollectionView()


func setupCollectionView()
      collectionView.delegate = self
      collectionView.dataSource = self
      collectionView.alwaysBounceVertical = true
      self.refreshControl = UIRefreshControl()
      self.refreshControl.attributedTitle = NSAttributedString(string: "Refreshing content...")
      self.refreshControl.addTarget(self, action: #selector(self.refresh), for: .valueChanged)
      collectionView!.addSubview(refreshControl)


 @objc func refresh(_ sender:AnyObject) 
    //do refreshing stuff

【讨论】:

【参考方案6】:
private let refreshControl = UIRefreshControl()

refreshControl.addTarget(self, action: #selector(youFunction), for: .valueChanged)
   
refreshControl.attributedTitle = NSAttributedString(string: "Fetching Data ...", attributes: nil)

DispatchQueue.main.async 
       self.refreshControl.endRefreshing()
       yourCollectionViewOrTableView.reloadData()
 

【讨论】:

以上是关于在 ViewController 的 UICollectionView 中拉取刷新的主要内容,如果未能解决你的问题,请参考以下文章

识别 CollectionView 中的单元格

从 UIImageView 中删除对象

如何在collectionView中重新加载补充视图

collectionView 分为三行 swift 4

在不同的 ViewController 中切换到新的 ViewController?

是否可以在 UITableViewCell 和 UICollectionViewCell 之间共享 xib?