一尘不染

问题检测按钮cellForRowAt

swift

我需要检测是否在UITableViewController中单击了按钮

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

 let LikesBtn = cell.viewWithTag(7) as! UIButton

}

阅读 218

收藏
2020-07-07

共1个答案

一尘不染

Swift中最简单,最有效的方法是回调闭包。

  • 子类UITableViewCell,用于标识UI元素的 viewWithTag 方法已过时。
  • 将自定义单元格的类设置为子类的名称,然后ButtonCellIdentifier在Interface Builder 中将标识符设置为。

  • 添加一个callback属性。

  • 添加一个动作并将按钮连接到该动作。

    class ButtonCell: UITableViewCell {
    
    var callback : (() -> Void)?
    
    @IBAction func buttonPressed(_ sender : UIButton) {
       callback?()
    }
    

    }

  • cellForRow回调分配到自定义单元格。

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell
     cell.callback = {
         print("Button pressed", indexPath)  
     }
     return cell
    

    }

  • 当按下按钮时,将调用回调。索引路径被捕获。

编辑

如果可以添加或删除细胞,则有一个警告。在这种情况下,将UITableViewCell实例作为参数传递并从那里获取索引路径

class ButtonCell: UITableViewCell {

    var callback : ((UITableViewCell) -> Void)?

    @IBAction func buttonPressed(_ sender : UIButton) {
       callback?(self)
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell
     let item = dataSourceArray[indexPath.row]
     // do something with item
     cell.callback = { cell in
         let actualIndexPath = tableView.indexPath(for: cell)!
         print("Button pressed", actualIndexPath)  
     }
     return cell
  }

如果甚至section可以更改,那么协议/委托可能会更有效。

2020-07-07