在 Segue 中点击 TableView 单元格返回 Nil

Posted

技术标签:

【中文标题】在 Segue 中点击 TableView 单元格返回 Nil【英文标题】:TableView Cell Tapped Returning Nil in Segue 【发布时间】:2015-10-31 04:10:39 【问题描述】:

我正在尝试将表视图信息传递给视图控制器并收到此“致命错误:在展开可选值时意外发现 nil”。这是我的代码.....

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    
        self.resultsTableView.deselectRowAtIndexPath(indexPath, animated: true)

        dispatch_async(dispatch_get_main_queue())  () -> Void in
            self.performSegueWithIdentifier("playerSegue", sender: self.resultsTableView)
        

    

还有……

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

    if segue.identifier == "playerSegue"
    
        let index = resultsTableView.indexPathForSelectedRow!.row
        let controller = segue.destinationViewController as! VideoViewController
        controller.vidTitleLBL.text = self.videoTitle[index]
        controller.videoId = self.videoId[index]

    

它没有在 indexPath.row 中显示信息。此外,该单元格是一个自定义 UITableViewCell,videoTitle 和 videoId 来自 YouTube JSON 项目数组。

【问题讨论】:

【参考方案1】:

在执行 segue 之前执行 self.resultsTableView.deselectRowAtIndexPath(indexPath, animated: true) 对自己造成了伤害。

取消选择该行后,您将异步执行转场。 当调用prepareForSegue 方法时,resultsTableView.indexPathForSelectedRow 已经是nil,因为您取消了之前选择的行。

【讨论】:

这完全正确。而且据我所知,异步调用不一定会使值为零,事实是无论如何,不​​再选择先前选择的行。 好的...这是我从其他地方得到的错误编码,试图解决这个问题。我删除了它,但它仍然为零....有什么想法吗?顺便说一句..我的初始数组是 ----- var videoTitle = [String]() --- 这可能是问题吗? 有什么快速的约定吗?通过指定!您在没有检查的情况下展开选项。对 nil 实施检查,检查 nil 的位置而不是您预期的位置,并重新编写代码以避免这种情况。【参考方案2】:

我通过建立一个公共 int 来修复它...

var selectedVideoIndex: Int!

didSelectRowAtIndexPath as..... func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

    selectedVideoIndex = indexPath.row
    dispatch_async(dispatch_get_main_queue(), 
        self.performSegueWithIdentifier("seguePlayer", sender: self)

    )


prepareForSegue 为...

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    
        if segue.identifier == "seguePlayer"
        

            print(self.videoTitle[selectedVideoIndex])
            print(self.videoId[selectedVideoIndex])
            let controller = segue.destinationViewController as! VideoViewController
            controller.vidTitleText = self.videoTitle[selectedVideoIndex]
            controller.videoId = self.videoId[selectedVideoIndex]
            controller.vidDescription = self.videoDescription[selectedVideoIndex]
            controller.vidIMG = self.videoIMG[selectedVideoIndex]

        
    

此外,由于我从 YouTube API 字典中获取的信息被转换为字符串,我必须在我的 VideoViewController 中建立空字符串并让我的 label.text(s) 与它们相等。如果有更好的方法,请在下方评论。

【讨论】:

以上是关于在 Segue 中点击 TableView 单元格返回 Nil的主要内容,如果未能解决你的问题,请参考以下文章

Segue 未从自定义 tableView 单元格触发

从一个 tableView 创建不同的 segue

直接进入另一个tableview的child segue?

无法识别单击单元格后的 tableView segue

TableView 单元格,滑动操作和不同的 segues Swift 4

在 Swift 中为嵌入式 tableView 中的 segue 做准备