UIRefreshControl 停留在 return 到前台 iOS 10

UIRefreshControl stuck on return to foreground iOS 10

我们在 UITableViewController 上实现了下拉刷新。对于长时间 运行 刷新,如果用户转到主屏幕然后 returns 到应用程序,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 的修复程序?

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

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

决定停止 background/disappear 上的刷新控制。如果在加载过程中用户 returns 到屏幕,我们不会尝试向用户显示刷新控件。

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

如果 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
  }
}