TableView Cell在Segue中挖掘了Nil

时间:2015-10-31 04:10:39

标签: ios swift uitableview segue didselectrowatindexpath

我正在尝试将表视图信息传递给View Controller,并且遇到这个“致命错误:在展开Optional值时意外发现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项目。

2 个答案:

答案 0 :(得分:2)

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

取消选择行后,异步执行segue。 调用prepareForSegue方法时,resultsTableView.indexPathForSelectedRow已经nil,因为您取消了先前选定的行。

答案 1 :(得分:0)

我通过建立公共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 as ...

 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)在那里相等。如果有更好的方法,请在下面发表评论。