表格单元格中的活动指标视图

时间:2019-05-28 16:27:12

标签: swift uitableview uiactivityindicatorview

我有一张桌子,我想做一张桌子,以便当我单击一个单元格时,活动指示器在它周围旋转,而不是在一个难以理解的地方

enter image description here

看起来像这样。在代码中,我具有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都死机了,我无能为力

1 个答案:

答案 0 :(得分:0)

简单的例子:

  • 在Interface Builder中,将表视图单元格的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中将原型单元的类设置为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并重新加载行。