【问题标题】:Swift UIbutton inside tableviewCell tp perform segue is not workinguitableviewCell 中用于执行 segue 的 Swift UIbutton 不起作用
【发布时间】:2017-05-18 12:21:47
【问题描述】:

我有一个自定义的 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
}

这是我的按钮操作:

func someAction(sender : UIButton){

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

}

这是我的转场函数:

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]

            }

        }
    }

【问题讨论】:

  • 你想要什么?是否要将数据显示为单独的视图控制器?
  • 我想用点击按钮切换到一个新的 Viewcontroller

标签: ios swift uitableview swift3 uibutton


【解决方案1】:

问题是,在prepare(for:sender:) 中,您现在使用indexPathForSelectedRow 获得indexPath,如果您直接单击按钮,那么未选中的单元格您需要通过performSegue(withIdentifier:sender:) 传递单元格的indexPath

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,则会被击中。

【讨论】:

  • 我应该怎么做而不是标签?
  • @UncleJunior 我建议你如何在不使用tag 的情况下获得indexPath。我之所以提到这一点,是因为 Apple 也建议不要在标签上中继。
【解决方案2】:

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

  • 在情节提要的自定义单元格中添加动作和出口。
  • 之后,您必须在自定义单元格中添加协议方法( 自定义委托方法)。
  • 并在您的视图控制器中使用这些方法。并添加功能 了解演出详情。

【讨论】:

  • 能否将代码添加到您的答案中,我不知道该怎么做,谢谢
  • 第二种解决方案:您必须在按钮上添加标签作为索引路径并使用此标签代替 indexPathForSelectedRow
  • 这是我所做的,但似乎当我单击按钮时它不起作用我应该先选择单元格然后单击按钮使其工作,顺便说一句,谢谢
【解决方案3】:

试试这个:

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


            if segue.identifier == "showDetail" {


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

                }

        }

【讨论】:

  • “任何?”类型的值没有成员“标签”
  • 通过发送者参数传递 uiButton 并尝试
猜你喜欢
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多