Swift - table 视图单元格中未触发按钮操作
Swift - Button action not triggered in table view cell
我有一个包含 TableView 的 ViewController。我想要在每个单元格中有一个红色按钮来做某事(假设 'hello' 用于测试),或者当我触摸任何地方但不在按钮上的单元格时,我会执行一个 segue。
但即使我按下按钮,执行的也是 segue。我尝试在 SF 上进行一些搜索,但 none 的问题对我有帮助...
我不知道这是否正常,但是当我触摸单元格时,所有行的白色背景都变成灰色,甚至红色按钮的背景也是如此。
在情节提要中我有这个单元格层次结构:
在单元格和按钮上都启用了用户交互。
在我发现他们说的问题中,在 'disclosure indicator' 的单元格集 'accessory' 上,我做到了,但如果可能的话,我想将其保留在 'None'。
我还为单元格设置了自定义 class,这是代码:
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var rentButton: UIButton? // I use this class for 2 tableview almost similar, but in the other I don't have the redButton, that's why I put an '?'
}
我还将 tableView 的委托和数据源设置为我的 ViewController,这是我的视图控制器的代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell
cell.rentButton!.tag = indexPath.row
cell.rentButton!.addTarget(self, action: #selector(MyViewController.rent(_:)), forControlEvents: .TouchUpInside)
return cell
}
// Rent() is never called:
func rent(sender: UIButton) {
print("here \(sender.tag)")
}
编辑:解决方案是从容器视图中删除按钮!
您可以通过编程方式在按下按钮时停止 segue 的操作。您可以执行以下操作:
删除从单元格到另一个视图控制器的 segue,并将其从 TableViewController 更改为另一个视图控制器
在您的 TableViewController 中创建一个变量 class 例如:var buttonPressed = false
在您的按钮操作中将 buttonPressed 设置为 true
在didSelectRow中,检查buttonPressed是否为true然后执行Segue并将buttonPressed更改为false,否则什么都不做
如前所述,将按钮从容器移动到内容视图
我有一个包含 TableView 的 ViewController。我想要在每个单元格中有一个红色按钮来做某事(假设 'hello' 用于测试),或者当我触摸任何地方但不在按钮上的单元格时,我会执行一个 segue。
但即使我按下按钮,执行的也是 segue。我尝试在 SF 上进行一些搜索,但 none 的问题对我有帮助...
我不知道这是否正常,但是当我触摸单元格时,所有行的白色背景都变成灰色,甚至红色按钮的背景也是如此。
在情节提要中我有这个单元格层次结构:
在单元格和按钮上都启用了用户交互。
在我发现他们说的问题中,在 'disclosure indicator' 的单元格集 'accessory' 上,我做到了,但如果可能的话,我想将其保留在 'None'。 我还为单元格设置了自定义 class,这是代码:
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var rentButton: UIButton? // I use this class for 2 tableview almost similar, but in the other I don't have the redButton, that's why I put an '?'
}
我还将 tableView 的委托和数据源设置为我的 ViewController,这是我的视图控制器的代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell
cell.rentButton!.tag = indexPath.row
cell.rentButton!.addTarget(self, action: #selector(MyViewController.rent(_:)), forControlEvents: .TouchUpInside)
return cell
}
// Rent() is never called:
func rent(sender: UIButton) {
print("here \(sender.tag)")
}
编辑:解决方案是从容器视图中删除按钮!
您可以通过编程方式在按下按钮时停止 segue 的操作。您可以执行以下操作:
删除从单元格到另一个视图控制器的 segue,并将其从 TableViewController 更改为另一个视图控制器
在您的 TableViewController 中创建一个变量 class 例如:var buttonPressed = false
在您的按钮操作中将 buttonPressed 设置为 true
在didSelectRow中,检查buttonPressed是否为true然后执行Segue并将buttonPressed更改为false,否则什么都不做
如前所述,将按钮从容器移动到内容视图