致命错误:将可选值 TableViewCell 展开到 UIViewController 时发现 Nil

Posted

技术标签:

【中文标题】致命错误:将可选值 TableViewCell 展开到 UIViewController 时发现 Nil【英文标题】:Fatal Error: Found Nil While Unwrapping Optional Value TableViewCell to UIViewController 【发布时间】:2015-11-01 03:22:24 【问题描述】:

我不知道发生了什么。在 segue、didSelectRowAtIndexPath 或强制转换方面需要帮助。我在带有自定义 tableviewcell 的 uiviewcontroller 顶部有一个 tableview。我成功地获得了 4 个字符串数组以在自定义单元格中展示自己。现在我正在尝试将此信息传递给另一个 uiviewcontroller。我正在创建一个公共 Int as....

var selectedVideoIndex: Int!

didSelectRowAtIndexPath 是.....

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

        let cell = self.resultsTableView.dequeueReusableCellWithIdentifier("searchCell", forIndexPath: indexPath) as! ResultsTableViewCell

        let newIndexPath = resultsTableView.indexPathForCell(cell)!
        selectedVideoIndex = newIndexPath.row
        self.performSegueWithIdentifier("playerSegue", sender: self)


    

prepareForSegue 是.....

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    
        if segue.identifier == "playerSegue"
        
            let controller = segue.destinationViewController as! VideoViewController

            controller.vidTitleLBL.text = self.videoTitle[selectedVideoIndex]
            controller.videoId = self.videoId[selectedVideoIndex]

        
    

我也在情节提要中手动创建 segue。我应该从单元格到新控制器还是从视图中执行此操作?谢谢。

****新****

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


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



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCellWithIdentifier("searchCell", forIndexPath: indexPath) as! ResultsTableViewCell
    cell.titleLabel.text = self.videoTitle[indexPath.row]
    cell.titleLabel.adjustsFontSizeToFitWidth = true
    cell.descriptionLabel.text = self.videoDescription[indexPath.row]
    cell.descriptionLabel.adjustsFontSizeToFitWidth = true
    let url = NSURL(string: self.videoIMG[indexPath.row])
    let data = NSData(contentsOfURL: url!)
    cell.videoImage.image = UIImage(data: data!)

    return cell



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


    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.vidTitleLBL.text = self.videoTitle[selectedVideoIndex]
            controller.videoId = self.videoId[selectedVideoIndex]

        
    

让它成功打印。现在在.. 处给出错误转换。

controller.vidTitleLBL.text = self.videoTitle[selectedVideoIndex]
            controller.videoId = self.videoId[selectedVideoIndex]

你觉得这是什么??感谢您的打印建议。

【问题讨论】:

嘿 Charles - 你打印出 self.videoTitle[selectedVideoIndex] 和 self.videoId[selectedVideoIndex] 的输出了吗? 刚刚做了。它返回错误...'let newIndexPath = resultsTableView.indexPathForCell(cell)!'它说我没有从 indexPath 开始。任何建议 您介意将其余代码发布到您正在使用的文件中吗?这对发现问题更有帮助。 当你创建一个 segue 时,你应该将 tableview 单元连接到新控制器,而不是从视图。你现在怎么样了? 检查哪个类是发送者对象。是您的自定义表格视图单元格还是其他东西 【参考方案1】:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 已经通过了indexPath,因此您不应在该委托中创建单元格:

selectedVideoIndex = indexPath.row

应该够了,去掉单元格代码。

或者prepareForSegue使用更好的方法:

let indexPath = tableView.indexPathForSelectedRows()

然后使用indexPath

print(self.videoTitle[indexPath.row])
print(self.videoId[indexPath.row])

【讨论】:

以上是关于致命错误:将可选值 TableViewCell 展开到 UIViewController 时发现 Nil的主要内容,如果未能解决你的问题,请参考以下文章

每次我滚动 cell.viewWithTag 都会在展开时给出致命错误发现 nil

Swift 错误致命错误:在展开可选值时意外发现 nil

致命错误:在展开可选值时意外发现 nil - 为啥?

为啥我收到错误:致命错误:在展开可选值时意外发现 nil?

SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil

@IBInspectable 致命错误:在展开可选值时意外发现 nil