tableviewCell内部的Swift UI按钮执行segue不起作用

时间:2017-05-18 12:21:47

标签: ios swift uitableview swift3 uibutton

我有一个自定义的tableviewcell,当我点击按钮时我在单元格内有按钮,下一个viewcontroller没有显示内容,但如果我点击单元格然后点击按钮,下一个视图控制器显示正确的内容在这里是我的代码:

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
}

这是我的按钮操作:

func someAction(sender : UIButton){

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

}

这是我的segue函数:

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]

            }

        }
    }

3 个答案:

答案 0 :(得分:4)

问题在于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)
    }
}

现在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]
        }
    }
}

注意:如果您忽略使用tag,那就太棒了。

答案 1 :(得分:0)

您必须使用自定义单元格并按照以下步骤操作:

  • 在故事板中的自定义单元格中添加操作和插座。
  • 之后,您必须在自定义单元格中添加协议方法( 自定义委托方法)。
  • 并在视图控制器中使用这些方法。并添加功能 显示细节。

答案 2 :(得分:0)

试试这个:

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


            if segue.identifier == "showDetail" {


                    (segue.destination as! ViewController).number = numberArray[sender.tag]

                }

        }