拉动以刷新 tableviewcontroller 负载
Posted
技术标签:
【中文标题】拉动以刷新 tableviewcontroller 负载【英文标题】:Pull to refresh on tableviewcontroller load 【发布时间】:2015-04-08 16:39:58 【问题描述】:我正在使用 UIRefreshControl 在表格视图上启用下拉刷新手势。
我已经使用情节提要设置了RefeshControl,并且在我的TableViewController 中使用以下代码将方法绑定到RefeshControl:
self.refreshControl?.addTarget(self, action: Selector("getData"), forControlEvents: UIControlEvents.ValueChanged)
在 getData() 方法结束时,我调用 tableview 上的 reloadData() 方法和 refreshcontrol 上的 stopRefreshing() 方法。
这工作正常。我可以拉动刷新,表格也会更新。
我想要的下一件事是在加载 TableViewController 时启动 RefreshControl。向用户显示应用正在获取数据。 我尝试手动启动以下代码:
self.refreshCorntrol?.beginRefreshing()
getData()
它会重新加载数据,但动画无法正常工作。 桌子空着。然后,当所有数据都被获取时,表格被拉下(就像我手动拉刷新时一样),然后立即向上推。
有人知道是否可以更改/修复此问题吗?
【问题讨论】:
【参考方案1】:可能会发生两件事。
1. UI 更新必须在主线程上分派。
您正在使用 .reloadData()
方法更新 tableView,这被认为是对 UI 的更新。话虽如此,您必须在主线程上调用.reloadData()
。虽然这应该已经为您自动完成,但我遇到了一些需要手动将其移动到主线程的情况。这可以使用
DispatchQueue.main.async
// Update UI ie. self.tableView.reloadData()
在你的函数内部。
2。程序化拉取刷新并不总是针对 .valueChanged 运行
当你调用拉刷新函数时,调用.valueChanged
(或者你在代码中的UIControlEvents.ValueChanged
)是很重要的,这样它就知道你刷新的目的是什么。当用户拉动刷新时,您的程序已经在您的 refreshController 声明的 forControlEvents
段中执行此操作。但是,当您从代码中手动调用它时,默认情况下它不会这样做。相反,您必须使用sendActions
传递操作。这可以通过使用来完成
self.refreshControl?.beginRefreshing()
self.refreshControl?.sendActions(for: UIControlEvents.ValueChanged)
getData()
调用拉刷新,而不仅仅是调用.beginRefreshing
后记
几天前我遇到了一个类似的问题,并在 Stack Overflow here 上发布了这个问题(我提供了署名,以防你在那里找到你的答案,因为这是我第一个解决方案的地方你来自)。
【讨论】:
以上是关于拉动以刷新 tableviewcontroller 负载的主要内容,如果未能解决你的问题,请参考以下文章
拉动以刷新 ViewController 和 tableView [重复]