双击UITableview中的单元以执行segue

时间:2018-11-20 05:10:31

标签: ios swift uitableview segue

我试图让用户点击单元格时切换到另一个视图控制器。目前,我是通过将故事板中的控件拖到我的视图控制器中,然后将以下代码传递给prepare(for segue...)来设置单元格的。基本上,我的警卫声明确认我具有正确的视图控制器,然后在它们之间传递一个对象。

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

     switch(segue.identifier ?? "") {

     case "ShowEventDetailsSegue":
        guard let navVC = segue.destination as? UINavigationController else {
            fatalError("Unexpected destination: \(segue.destination)")
        }

        guard let EventDetailViewController = navVC.viewControllers.first as? EventViewController else {
            fatalError("Unexpected navigation view controller: \(String(describing: navVC.viewControllers.first))")
        }

        guard let selectedEventCell = sender as? EventTableViewCell else {
            fatalError("Unexpected sender: \(String(describing: sender))")
        }

        guard let indexPath = tableView.indexPath(for: selectedEventCell) else {
            fatalError("The selected cell is not being displayed by the table")
        }

        let selectedEvent = events[indexPath.section]
        EventDetailViewController.event = selectedEvent


         default:
            fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
     }
 }

我知道其他人建议拨打

之类的电话
DispatchQueue.main.async { 
    self.present(myVC, animated: true, completion: nil)
}

(请参见herealso here

但是,当我这样做时,我收到一条错误消息“由于未捕获的异常'NSInvalidArgumentException',正在终止应用程序,原因:'应用程序试图以模态方式显示活动的控制器”。

基本上,我希望用户只能单击一次单元格,仍然能够将数据传递给另一个视图控制器。

还奇怪的是,这才刚刚开始发生。今天以前我没有这个问题。

2 个答案:

答案 0 :(得分:0)

所以您正在做的是:

tableView didSelectRowAt方法中,您要添加:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
}

触发delegate方法:

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

已经有一个控制器准备打开,而您正在以编程方式呈现另一个控制器,这显然会引发错误。

您可以编写另一种逻辑来tableView didSelectRowAt中以编程方式呈现视图,也可以在第二个视图控制器viewDidLoad方法中移动整个代码。

答案 1 :(得分:0)

结果是,我的单元格的选择样式设置为“无”。

cell.selectionStyle = UITableViewCellSelectionStyle.none

虽然我不想要选择样式,所以解决方法是进行异步调用

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
    }
}

现在可以解决此问题。有关更多信息,请查看this post.