我有一个带有xib的自定义单元格,这个单元格包含一个按钮,当按下按钮时我想做一个动作,但不是在我的自定义单元格类中,而是来自包含自定义的tableview的viewcontroller内部细胞,有什么帮助吗?
答案 0 :(得分:4)
首先,你应该编写一个协议,例如:
protocol CustomCellDelegate {
func doAnyAction(cell:CustomUITableViewCell)
}
然后在自定义单元格类中声明:
weak var delegate:CustomCellDelegate?
并在自定义单元类中的IBAction内部:
@IBAction func onButtonTapped(_ sender: UIButton) {
delegate?.doAnyAction(cell: self)
//here we say that the responsible class for this action is the one that implements this delegate and we pass the custom cell to it.
}
现在在你的viewController中:
1-让您的视图控制器实现CustomCellDelegate。 2-在声明细胞时,在你的cellForRow中忘记写:
cell.delegate = self
3-最后在viewcontroller中调用该函数:
func doAnyAction(cell: CustomUITableViewCell) {
let row = cell.indexPath(for: cell)?.row
//do whatever you want
}
}
答案 1 :(得分:2)
您可以使用委托模式。创建自定义协议。
protocol CustomTableViewCellDelegate {
func buttonTapped() }
并且在tableview单元格上符合委托
class CustomTableViewCell: UITableViewCell {
var delegate: CustomTableViewCellDelegate!
@IBAction func buttonTapped(_ sender: UIButton) {
delegate.buttonTapped()
} }
表格视图数据源
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath) as! CustomTableViewCell
cell.delegate = self
return cell
}
从表视图控制器或视图控制器
符合协议(委托)extension TestViewController: CustomTableViewCellDelegate {
func buttonTapped() {
print("do something...")
} }
答案 2 :(得分:0)
只需获取UIButton
中的cellForRowAtIndexpath
即可。
然后编写以下代码。
button.addTarget(self, action:#selector(buttonAction(_:)), for: .touchUpInside).
func buttonAction(sender: UIButton){
//...
}
答案 3 :(得分:0)
从viewController中为tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
方法添加按钮操作。
cell.btn.tag = indexPath.row;
cell.btn.addTarget(self, action:#selector(handleButtonClicked(_:)), for: .touchUpInside).
在视图控制器中编写选择器功能:
func handleButtonClicked(sender: UIButton){
int cellofClickedbutton = sender.tag;
//...
}
答案 4 :(得分:0)
在您的单元格中定义协议:
protocol MyCellDelegate: class {
func buttonTapped()
}
并定义委托变量:
weak var delegate: MyCellDelegate?
使viewController
符合定义的协议。
在viewController
中创建单元格时,请为其指定委托:
cell.delegate = self
点击单元格中的按钮后,发送代理相应的消息:
delegate?.buttonTapped()
在viewController
中实施方法:
func buttonTapped() {
//do whatever you need
}
您可以将单元格的索引作为参数传递,因此viewController
知道点击了哪个单元格按钮。