【问题标题】:I am trying to refresh a set of UICollectionViews all placed on a UIScrollView by pulling down on the UIScrollView我正在尝试通过下拉 UIScrollView 来刷新所有放置在 UIScrollView 上的一组 UICollectionView
【发布时间】:2019-09-25 18:07:25
【问题描述】:

我有多个UICollectionViews 都放在UIScrollView 上。我想下拉 UIScrollView(类似于 Instagram 和 Twitter 提要刷新器)并刷新 UICollectionViews 中的数据。但是,我尝试的方法没有奏效。

下面是我尝试实现的代码。当我运行它并尝试下拉UIScrollView。我看到指示刷新的表盘,但没有任何变化,并且从未打印过“刷新”。

 var refreshControl: UIRefreshControl!
 override func viewDidLoad()  {
      super.viewDidLoad()

      scrollView.alwaysBounceVertical = true
      scrollView.bounces  = true
      refreshControl = UIRefreshControl()
      refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
      self.scrollView.addSubview(refreshControl)
   }

  @objc func didPullToRefresh() {

     targetCollectionView.reloaddata()
     print("Refersh")

     // For End refrshing
     refreshControl.endRefreshing()  


   }

【问题讨论】:

  • 检查你的 contentsize 高度是否小于你的 UIScrollView,然后它不会工作。还要注意这一点 AllowBounceVertical = true 并设置 UIScrollView 委托
  • 尝试分配像scrollView.refreshControl = refreshControl
  • 是的,如果您的目标是 iOS 10 及更高版本,请尝试 Raghav7890 解决方案,并且 Prasanth 的建议也很重要,如果您的滚动视图的内容大小高度低于滚动视图,那么它将无法工作

标签: ios swift xcode uiscrollview refresh


【解决方案1】:

由于scrollview内部有多个collection view,有可能在scrollview上没有触发pull to refresh,(可能在collection view上,因为有多个collection view)

didPullToRefresh 方法未调用的可能原因?

您已在滚动视图上添加了UIRefreshControl。因此,当您拉下视图时,它是集合视图(我认为不是滚动视图)。这就是 "refresh" 永远不会被打印的原因。

如何检测拉动了哪个视图进行刷新?

假设您在 self.view 上有 2 个集合视图和 1 个滚动视图。所以在下面的所有视图上添加UIRefreshControl...

//add refresh control on collection view 1
     let refreshController1 = UIRefreshControl(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 30))
    refreshController1.addTarget(self, action: #selector(colView1Refreshed), for: .valueChanged)
    collectionView1.refreshControl = refreshController1

//add refresh control on collection view 2
    let refreshController2 = UIRefreshControl(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 30))
    refreshController2.addTarget(self, action: #selector(colView2Refreshed), for: .valueChanged)
    collectionView2.refreshControl = refreshController2

//add refresh control on scrollview
    let refreshController3 = UIRefreshControl(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 30))
    refreshController3.addTarget(self, action: #selector(scrollViewRefreshed), for: .valueChanged)
    scrollView.refreshControl = refreshController3

然后实现这些方法来检查拉取的是哪个视图。

@objc func colView1Refreshed() {
    print("collection view 1 pulled")
}

@objc func colView2Refreshed() {
    print("collection view 2 pulled")
}

@objc func scrollViewRefreshed() {
    print("collection view 3 pulled")
}

通过这种方式,您可以确定触发了哪个刷新控件的操作。

注意:上面提到的代码只是一个例子。如果您有超过 2 个集合视图,则需要在所有其他视图上添加 UIRefreshControl 以检测它。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2011-12-20
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2016-12-30
    • 2013-10-12
    • 2016-10-14
    • 2016-02-03
    相关资源
    最近更新 更多