带有 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()
,因此立即结束。
我在容器内有一个 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()
,因此立即结束。