我需要检测是否在UITableViewController中单击了按钮
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let LikesBtn = cell.viewWithTag(7) as! UIButton }
Swift中最简单,最有效的方法是回调闭包。
UITableViewCell
将自定义单元格的类设置为子类的名称,然后ButtonCellIdentifier在Interface Builder 中将标识符设置为。
ButtonCellIdentifier
添加一个callback属性。
callback
添加一个动作并将按钮连接到该动作。
class ButtonCell: UITableViewCell { var callback : (() -> Void)? @IBAction func buttonPressed(_ sender : UIButton) { callback?() }
}
在cellForRow回调分配到自定义单元格。
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可以更改,那么协议/委托可能会更有效。
section