下面是一个示例,演示了如何在Swift 4中使用委托模式来处理UITableView单元格按钮操作。
首先,我们定义一个协议,用于处理按钮操作的委托方法:
protocol TableViewCellDelegate: class {
func buttonDidTap(cell: UITableViewCell)
}
然后,在自定义的UITableViewCell类中,添加一个按钮,并设置其点击事件的处理方法:
class CustomTableViewCell: UITableViewCell {
weak var delegate: TableViewCellDelegate?
@IBAction func buttonDidTap(_ sender: UIButton) {
delegate?.buttonDidTap(cell: self)
}
}
在UIViewController中,我们要实现TableViewCellDelegate协议,并在tableView(_:cellForRowAt:)方法中设置委托:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomTableViewCell")
}
// UITableViewDataSource methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
cell.delegate = self
return cell
}
// TableViewCellDelegate method
func buttonDidTap(cell: UITableViewCell) {
if let indexPath = tableView.indexPath(for: cell) {
print("Button tapped in cell at indexPath: \(indexPath)")
}
}
}
注意,我们在tableView(_:cellForRowAt:)方法中设置了委托,并在buttonDidTap(cell:)方法中通过tableView.indexPath(for:)方法获取按钮所在的单元格的indexPath。
最后,我们需要在Storyboard中将UITableView的dataSource和delegate链接到ViewController,并设置UITableViewCell的Class为CustomTableViewCell。
这样,当按钮在自定义单元格内被点击时,buttonDidTap(cell:)方法将被调用,并打印出按钮所在的单元格的indexPath。
希望这可以帮助到你!