我有一张桌子,我想做一张桌子,以便当我单击一个单元格时,活动指示器在它周围旋转,而不是在一个难以理解的地方
看起来像这样。在代码中,我具有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])
}
此功能在演示者中实现。
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都死机了,我无能为力
答案 0 :(得分:0)
简单的例子:
Style
设置为custom
。创建一个自定义类,该子类是项目中UITableViewCell
的子类
class TitleCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var activity: UIActivityIndicatorView!
var isRunning : Bool = false {
didSet {
isRunning ? activity.startAnimating() : activity.stopAnimating()
}
}
}
在Interface Builder中将原型单元的类设置为TitleCell
,并将标签和指示符连接到IBOutlets
使用至少一个title
和一个isRunning
属性创建一个数据模型。
struct Model {
let title: String
var isRunning : Bool
}
声明数据源数组
var items = [Model]()
在cellForRow
中更新UI元素(将标识符替换为您的真实标识符)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TitleCell
let item = items[indexPath.row]
cell.titleLabel!.text = item.title
cell.isRunning = item.isRunning
return cell
}
要启动和停止指标实施didSelectRow
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
items[indexPath.row].isRunning.toggle()
tableView.reloadRows(at: [indexPath], with: .none)
}
要更改指标的状态,请始终使用模式在模型中设置isRunning
并重新加载行。