带有 UIRefreshControl 的 TableView 在重新加载时似乎有点故障?

TableView with UIRefreshControl seems to glitch a bit when reloading?

我在容器内有一个 table 视图。当用户向下滑动刷新时,我注意到单元格立即弹回顶部。看起来很乱。

func setupRefresh() {
    //        refreshControl.attributedTitle = NSAttributedString(string: "")
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControl.Event.valueChanged)
    tableView.insertSubview(refreshControl, at: 0)
    //tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender:AnyObject) {
    // Code to refresh table view
    print("Refreshing...")
    tableView.isScrollEnabled = false
    array.removeAll()
    items = 0
    number = 0
    getRecentNotifs(limit: 10)
    //        refreshControl.endRefreshing()
    //        tableView.isScrollEnabled = true
    //        tableView.isUserInteractionEnabled = true
}

然后在我的 fetch 方法中执行此操作。我也尝试在刷新内部执行此操作但失败了,产生了相同的结果

dispatchGroup.notify(queue: .main, execute: {
    if true {
        if !self.tableView.isScrollEnabled {
            self.refreshControl.endRefreshing()
            self.tableView.isScrollEnabled = true
        }

        self.tableView.reloadData()
    }
})

我已经查看了 here 和更多地方,但没有成功。

一个非常糟糕的解决方法可能是:

 ...
Timer.scheduledTimer(timeInterval: 0.8, target: self, selector: #selector(self.delayedAction), userInfo: nil, repeats: false)
}

@objc func delayedAction() {
    refreshControl.endRefreshing()
}

refreshControl.endRefreshing() 移动到您从中获取数据的函数的完成处理程序中。

示例:

func getRecentNotifs(limit: Int) {

     // Get Data ...

     Network.getData(limit: limit) { (data, error) in   // Completion Block

          // Update Table View
          self.tableView.reloadData()

          // End Refresh Control
          self.refreshControl.endRefreshing()
          self.activityIndicatorView.stopAnimating()

     })

}

您在刷新控件的目标方法中调用了 refreshControl.endRefreshing(),因此立即结束。