致命错误:将可选值 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