gpt4 book ai didi

swift - 表格单元格中的事件指示器 View

转载 作者:行者123 更新时间:2023-11-30 10:43:13 26 4
gpt4 key购买 nike

我有一个表格,我想制作它,以便当我单击一个单元格时,事件指示器围绕它旋转,而不是在一个难以理解的地方旋转

enter image description here

看起来像这样。在代码中,我有 MainViewController 模块和 Presenter 模块,它们确定何时启动事件指示器。我有一个导出

@IBOutlet weak var activity: UIActivityIndicatorView! = UIActivityIndicatorView(style: .gray)

我在 View Controller 中有两个函数来启动动画和停止

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)
}
}
}

正如我所假设的,在 View Controller 中,当你点击一个单元格时,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 紧绷,我无能为力

最佳答案

简单的例子:

  • 在 Interface Builder 中,将 TableView 单元格的 Style 设置为 custom
  • 将标签和事件指示器拖到单元格中,并根据需要设置适当的约束。
  • 选择事件指示器,按 ⌘⌥4(属性检查器)并选中停止时隐藏
  • 创建一个自定义类,项目中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 中将原型(prototype)单元的类设置为 TitleCell 并将标签和指示器连接到 IBOutlets

  • 创建一个至少包含 titleisRunning 属性的数据模型。

    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 的模式并重新加载行。

关于swift - 表格单元格中的事件指示器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com