拉动以刷新 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 [重复]

在 TableView 标题下放置拉动以刷新控件

RefreshControl 数据重复每次在 React Native 中拉动以刷新 ScrollView

JQuery Mobile:拉动以刷新列表视图[重复]

重置分页以重新获取拉动时的默认变量以刷新抛出光标警告?