双击 UITableview 中的单元格以执行 segue

Posted

技术标签:

【中文标题】双击 UITableview 中的单元格以执行 segue【英文标题】:Double tap on cell in UITableview to perform segue 【发布时间】:2018-11-20 05:10:30 【问题描述】:

我试图让用户在点击单元格时转到另一个视图控制器。目前,我通过将故事板中的控件拖动到我的视图控制器,然后为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)

(见here和also here)

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

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

同样奇怪的是,这才刚刚开始。在今天之前我没有这个问题。

【问题讨论】:

你在哪里添加了这个代码self.present(myVC, animated: true, completion: nil) 您需要在代码中触发 segue,或者在情节提要中设置它。你可能两者都做,因此例外。 @Amit 我在我的 gaurd 语句下方添加了代码,就在默认值之前。由于没有更好的术语,我已经通过“点击单元格”来触发 segue。 @Evgeniy 我同意。我目前在故事板中设置它,然后在我的prepare( for segue...) 方法中处理逻辑。如果可能的话,我想这样处理。 @Evgeniy 这两种方法我都试过了,我仍然需要点击两次才能使单元格继续 【参考方案1】:

所以你正在做的是:

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 方法中移动整个代码。

【讨论】:

有点。基本上,我相信我需要切换我的代码,但我仍然想prepare 进行转场,因为我需要将数据传递给接收控制器。【参考方案2】:

原来,我的单元格的选择样式设置为无。

cell.selectionStyle = UITableViewCellSelectionStyle.none

我不想要选择样式,所以解决这个问题的方法是进行异步调用

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

这现在解决了这个问题。欲了解更多信息,请查看this post.

【讨论】:

以上是关于双击 UITableview 中的单元格以执行 segue的主要内容,如果未能解决你的问题,请参考以下文章

子类 uitableview 单元格以快速更改分隔符高度

自定义表格单元格以显示图像

导出到excel时如何取消合并s-s-rs中的单元格以尝试排序

获取 UITableview 部分中的最后一个单元格

用户单击 UITableView 中的单元格进行重新排序,我如何知道被拖动单元格的索引和位置?

使用随机着色的单元格以5×5表格呈现