【发布时间】:2019-05-28 16:27:12
【问题描述】:
我有一张桌子,我想这样当我点击一个单元格时,活动指示器会围绕它旋转,而不是在一个难以理解的地方
看起来像这样。在代码中,我有 MainViewController 模块和 Presenter 模块,它们确定何时启动活动指示器。我有一个出口
@IBOutlet weak var activity: UIActivityIndicatorView! = UIActivityIndicatorView(style: .gray)
我在视图控制器中有两个函数可以启动和停止动画
func startActivity() {
activity.startAnimating()
}
func stopActivity() {
activity.stopAnimating()
}
有一个函数可以处理对单元格的点击
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
output.callFromThePresenter(array: array[indexPath.row])
}
这个功能在presenter中实现。
func callFromThePresenter(array: String) {
let userInteractiveQueue = DispatchQueue.global(qos: .userInteractive)
async {
DispatchQueue.main.async {
self.view.startActivity()
}
userInteractiveQueue.async {
self.interactor.functionFromInteractor(data: array)
}
}
}
正如我所假设的,在视图控制器中,当您单击一个单元格时,callFromThePresenter() 函数将起作用,并且 Interactor 中的动画函数和数据传输函数将在其中启动,只要 Interactor 有完成这个函数,它会将数据返回给Presenter,在回调函数里面,我会运行stopActivity()函数。它一直有效,直到我决定设置定位
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
output.callFromThePresenter(array: array[indexPath.row])
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryView = self.activity
}
只要我添加了这两行
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryView = self.activity
我打破了一切,就像我启动一样,我点击表格单元格,轮子在需要的地方转动,一切正常,但是在收到结果后,我再次戳了某个单元格,整个程序挂起,并且我不知道是什么原因。同时,函数计算出我能理解多少,因为到了控制台,函数启动并得到了一些结果,但是整个 UI 卡住了,我什么都做不了
【问题讨论】:
-
看起来您有 一个
UIActivityIndicatorView用于 多个 单元格。这行不通。并考虑修改didSelectRowAt中的单元格不是持久的。细胞被重复使用。而且array: String的声明很混乱。 -
@vadian ,是的,我有一个,但问题是我不知道如何正确使用几个以及如何正确完成
-
创建一个 custom 单元格,其中包含
UIActivityIndicatorView。将属性isRunning添加到您的数据模型中。根据isRunning启动/停止cellForRow中的指标视图。如果您的任务停止,请将isRunning设置为 false 并重新加载相应的行以停止指示器。 -
@vadian,不太明白,但我会尝试
-
我用一个例子写了一个答案。
标签: swift uitableview uiactivityindicatorview