UIRefreshControl 卡在返回前台 iOS 10

Posted

技术标签:

【中文标题】UIRefreshControl 卡在返回前台 iOS 10【英文标题】:UIRefreshControl stuck on return to foreground iOS 10 【发布时间】:2017-03-18 14:09:23 【问题描述】:

我们在 UITableViewController 上实现了下拉刷新。对于长时间运行的刷新,如果用户转到主屏幕然后返回到应用程序,UIRefreshControl 似乎被卡住 - 它仍然显示但没有旋转。在 SO 上尝试了多种解决方案,但均未奏效。

我们的实现:

    //Configure pull to refresh when user "pulls down"
    self.refreshControl?.addTarget(self, action: #selector(NotificationTableViewController.handleRefresh(refreshControl:)), for: UIControlEvents.valueChanged)

    //In handleRefresh we will explicitly start the refresh control if this is a background refresh and not a user initiated pull to refresh 
    refreshControl.beginRefreshing()
    self.tableView.setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.size.height - self.topLayoutGuide.length), animated: true)

    //Then once we have reloaded data we stop the refresh in the same manner for user initiated or background refresh (done on main thread)
    refreshControl.endRefreshing()

我们尝试过的解决方案:

Restarting the refreshing when entering foreground when currently refreshing:

if refreshControl!.isRefreshing == true 
     refreshControl!.endRefreshing()
     refreshControl!.beginRefreshing()
     self.tableView.setContentOffset(CGPoint(x: 0, y: - refreshControl!.frame.size.height - self.topLayoutGuide.length), animated: true)

... 如果我们不应该刷新,那么以下解决方案是关于结束刷新。我确实尝试过它们,但在我们的情况下,我们应该令人耳目一新......

Calling endRefreshing() when entering foreground if not refreshing:

if refreshControl?.isRefreshing == false 
    refreshControl?.endRefreshing()

Sending the refresh control to the back on entering foreground:

self.refreshControl?.superview?.sendSubview(toBack: self.refreshControl!)

有人有适用于 ios 10 的修复程序吗?

【问题讨论】:

能否请您为 UIRefreshControl 实现? 添加了我们的实施细节 你检查了吗? ***.com/questions/24341192/… 不,我会在今天晚些时候尝试,谢谢 为什么要显式设置表格的内容偏移量?刷新控件通常设置为tableHeaderView,表格会自动处理拉取刷新和内容偏移。然后,您可以从后台显式调用 beginRefreshing beginAnimations、endAnimations、endRefreshing,而表将负责其余的工作。当您显式设置内容偏移量时,您还需要在完成刷新时将其设置回 0。我在上面的代码中没有看到。 【参考方案1】:

通常起作用的是to stop the refresh control on background/disappear and start it again on foreground/appear。

但即使这样也存在竞争条件问题:我们的线程 #1 在后台加载数据,另一个线程 #2 处理前台/外观处理。如果线程 #1 由于数据加载完成而停止刷新指示器,同时线程 #2 尝试检查状态并启动刷新控件,那么我们可以在刷新控件正在旋转但我们的加载数据请求的情况下自行处理已经完成。我们可以尝试同步所有这些,但这不值得……

决定在后台停止刷新控制/消失。如果用户在加载过程中返回屏幕,我们不会费心尝试向用户显示刷新控件。

    if refreshControl!.isRefreshing == true 
        refreshControl!.endRefreshing()
    

【讨论】:

【参考方案2】:

如果 refreshControl!.isRefreshingfalse 但您仍然有这个故障,请使用:

override func viewWillAppear(_ animated: Bool) 
  super.viewWillAppear(animated)

  //fixes bug with refreshControl freezing while switching tabs

  if tableView.contentOffset.y < 0 
    tableView.contentOffset = .zero
  

【讨论】:

以上是关于UIRefreshControl 卡在返回前台 iOS 10的主要内容,如果未能解决你的问题,请参考以下文章

Django - jQuery 数据表卡在加载中

pstree查看进程卡在哪里

无法覆盖“UIRefreshControl”类型的可变属性“refreshControl”?具有协变类型“UIRefreshControl”

下面的 UIRefreshControl 块视图

使用 UIRefreshControl

UIRefreshControl 重复出现