tableviewCell tp 中的 Swift UIbutton 执行 segue 不起作用

Unc*_*ior 1 uibutton uitableview ios swift swift3

我有一个自定义 tableviewcell 并且当我单击按钮时,单元格内有按钮,下一个视图控制器不显示他的内容,但是如果我单击单元格然后单击按钮,下一个视图控制器显示正确的内容是我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
    cell.label.text = numberArray[indexPath.row]
 cell.button.tag = indexPath.row

    cell.button.addTarget(self,action:#selector(TableViewController.someAction(sender:)),
                          for:.touchUpInside)
    return cell
}
Run Code Online (Sandbox Code Playgroud)

这是我的按钮操作:

func someAction(sender : UIButton){

self.performSegue(withIdentifier: "showDetail", sender: self)

}
Run Code Online (Sandbox Code Playgroud)

这是我的转场功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {


        if segue.identifier == "showDetail" {

            if let indexPath = tableView.indexPathForSelectedRow
            {
                (segue.destination as! ViewController).number = numberArray[indexPath.row]

            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

Nir*_*v D 5

问题是,如果您直接单击按钮,那么prepare(for:sender:)您现在正在indexPath使用的indexPathForSelectedRow单元格没有选择您需要的是将indexPath单元格的performSegue(withIdentifier:sender:).

func someAction(sender:  UIButton) {
    let point = sender.superview?.convert(sender.center, to: self.tableView)
    if let indexPath = self.tableView.indexPathForRow(at: point!) {
        //pass indexPath as sender with performSegue
        self.performSegue(withIdentifier: "showDetail", sender: indexPath)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在prepare(for:sender:)投的sender,以indexPath你们都好去。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = sender as? IndexPath
        {
            (segue.destination as! ViewController).number = numberArray[indexPath.row]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您忽略使用tag.