我知道这个问题已经在SO中被问过几次了。尽管尝试了这些,我仍然无法解决我的问题。
我在UIViewController中使用UITableView。我有一个自定义的UITableViewCell,里面有几个按钮。但是,我无法使Button响应Click事件。
开发环境是iOS 9和Swift 2
使用的片段:
BranchNearMeTableViewCell.swift包含
@IBOutlet weak var btnDetails: UIButton!
查看控制器类
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("branchNearTableCell") as! BranchNearMeTableViewCell
cell.btnDetails.tag = indexPath.row
cell.btnDetails.addTarget(self, action: "showDetails:", forControlEvents: .TouchUpInside)
}
func showDetails(sender: UIButton){
print("Button Pressed:")
}
其他信息:
TableView和TableCellView在“界面”构建器中禁用了用户交互,因为不希望整个单元格可单击。
TableViewCell中的UIButton启用了用户交互。
作为一个iOS菜鸟,我可能会犯一个我可能忽略的愚蠢错误。
我检查的类似问题包括:
我非常感谢有关此问题的任何帮助。
答案 0 :(得分:5)
我也会在表格视图单元格上设置<hr />
{{name}}
userInteractionEnabled
。我会阻止点击使用true
UITableView
到allowsSelection
还要记得删除false
中的目标和操作,因为单元格已被回收,按钮可能已经有了目标和操作,它可能会添加一秒。
答案 1 :(得分:4)
我遇到了类似的问题。我通过UIButton
以编程方式向UITableViewCell
中添加了addSubview
。该按钮将不会响应触摸事件。使用Debug View Hierarchy,我最终发现添加到UITableViewCell
的所有子视图都在contentView
之后,这阻止了用户输入到达UIButton
。通过将UIButton
添加到contentView
而不是UITableViewCell
,解决了该问题。
答案 2 :(得分:3)
我今天遇到了这个问题,在静态 UITableview 单元格中有一个按钮,它没有响应用户事件。 我意识到单元格的“内容视图”也有一个“启用用户交互”复选框。确保在“文档大纲”菜单中的 UITableview 单元格中选择“内容视图”,然后在“属性检查器”中勾选“启用用户交互”框 - 请参阅附图以供参考。还需要检查单元格的“启用用户交互”才能使其正常工作。 希望这可以帮助。 XCcode screen shot
答案 3 :(得分:2)
对于以编程方式创建的视图,唯一需要记住的是在 lazy var
中使用 UITableViewCell
声明按钮。并且还将子视图添加到 contentView
而不是单元格本身例如:
class CounterCell: UITableViewCell {
lazy var incrementButton: UIButton = {
let button = UIButton()
button.setTitle("+", for: .normal)
button.addTarget(self, action: #selector(incrementAction), for: .touchUpInside)
return button
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(incrementButton)
// Your constrains here
}
@objc func incrementAction() {
}
}
以编程方式使用视图时,无需添加 .userInteractionEnabled
标志。
然后要从单元格中取出操作,只需添加一个委托并从 UITableViewDataSource
中分配它。
答案 4 :(得分:2)
我找到了一个简单的解决方案:
继承UITableViewCell,并覆盖init()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
//init subviews, eg. self.switch = UISwitch()
super.init(style: style, reuseIdentifier: reuseIdentifier)
// add this line magic code
contentView.isUserInteractionEnabled = true
//add subviews, e.g. self.addSubView(self.switch)
}
答案 5 :(得分:1)
此外,请确保您要在按钮设置以外的按钮上添加目标操作。因此,而不是
let button: UIButton = {
//addTarget...
}()
您可以使用某个功能在发生某些情况后设置按钮:
func setButtonsUp() {
// myButton.addTarget
}
答案 6 :(得分:0)
第一眼看到您的代码似乎没有任何问题
所以我建议你在按钮的超视图中添加背景颜色,为什么?因为如果按钮位于超级视图的框架之外,它将永远不会接收到触摸
如果您看到该按钮不在背景颜色内,则可能是您在定位项目,检查约束或您正在使用的任何内容时遇到问题。
还要检查按钮的框架
您也可以通过在运行时检查视图来完成这两项工作,here一个教程。
答案 7 :(得分:0)
我不知道代码中有什么问题,但我可以建议我个人使用它并且它适用于我
在BranchNearMeTableViewCell.swift
中@IBOutlet var btnDetails: UIButton!
@IBAction func btnDetailsClick(sender: AnyObject) {
tapButton?(self)
}
var tapButton: (UITableViewCell -> Void)?
在表视图控制器中
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("branchNearTableCell") as! BranchNearMeTableViewCell
cell.tapButton = {(user) in
//User will be tablecell here do whatever you want to do here
}
}
因此,如果您点击表格单元格中的按钮,则会调用此cell.tapButton,您可以在此处执行任何操作
答案 8 :(得分:0)
您只需要做(在ViewDidLoad中):
mTableView.delaysContentTouches = false