我正在尝试将表视图信息传递给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项目。
答案 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)在那里相等。如果有更好的方法,请在下面发表评论。