推送视图控制器时发现线程错误为零

Posted

技术标签:

【中文标题】推送视图控制器时发现线程错误为零【英文标题】:Thread Error while pushing view controller found nil 【发布时间】:2020-10-22 20:42:24 【问题描述】:

我试图在选择单元格时将用户发送到另一个视图控制器。我正在使用 didSelectRowAt 函数来推送视图控制器并用数据填充图像和标签。我遇到了一个崩溃,上面写着:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valuepushViewController 行中。我不确定为什么会发生这个错误,因为这在使用另一个视图控制器时工作了一段时间。

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    tableView.deselectRow(at: indexPath, animated: true)
    
    
    let songName = songs[indexPath.row].cleanName
    let fileURLString = "\(filePath)\(songName)"
    print(fileURLString)
    Player.shared.playStream(fileUrl: fileURLString)
    let SvC = storyboard?.instantiateViewController(withIdentifier: "SongsPlayerViewController") as? SongPlayerViewController
    
    SvC?.songNames.text = songs[indexPath.row].cleanName
    SvC?.songCover.image = UIImage(named: songs[indexPath.row].cover)
    
    self.navigationController?.pushViewController(SvC!, animated: true) // Thread 1 CRASH
    
    

【问题讨论】:

【参考方案1】:

这是在告诉你SvC为nil,这意味着这条线失败了:

let SvC = storyboard?.instantiateViewController(withIdentifier: "SongsPlayerViewController") as? SongPlayerViewController

我怀疑您没有分配 Storyboard 标识符,或者拼写错误。

当您使用! 时,如SvC!,您是在告诉系统如果一个值为nil,您希望程序崩溃。这在这种代码中实际上相当有用,因为您可能会发现崩溃并告诉您问题出在哪里更好,而不是安静地什么都不做。但是,您在一个无用的地方应用 !。如果您希望此代码因错误而崩溃,您应该在分配SvC 时执行此操作,使用as! 而不是as?。这将消除您后续调用中的所有?.,并使错误位置更加清晰。

【讨论】:

以上是关于推送视图控制器时发现线程错误为零的主要内容,如果未能解决你的问题,请参考以下文章

UITableView推送segue多次触发

IBAction 推送视图控制错误-“预期表达式”

iOS - 从导航控制器推送时应用程序冻结

线程化核心数据和 UINavigationController

当我从另一个视图控制器调用时,为啥我的表视图为零?

Xamarin/Mvvmcross:收到 iOS 推送通知时打开不同的视图控制器