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 的操作。您可以执行以下操作:

  1. 删除从单元格到另一个视图控制器的 segue,并将其从 TableViewController 更改为另一个视图控制器

  2. 在您的 TableViewController 中创建一个变量 class 例如:var buttonPressed = false

  3. 在您的按钮操作中将 buttonPressed 设置为 true

  4. 在didSelectRow中,检查buttonPressed是否为true然后执行Segue并将buttonPressed更改为false,否则什么都不做

  5. 如前所述,将按钮从容器移动到内容视图