【问题标题】:Swift. iOS. Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value [duplicate]迅速。 IOS。线程 1:致命错误:在隐式展开可选值时意外发现 nil [重复]
【发布时间】:2022-07-07 18:23:13
【问题描述】:

面对这样的焦虑。注册到单元格并导航到 DetailViewController 时,出现以下错误:“错误流 1:致命错误:在隐式扩展可选值时意外发现 nil”并且应用程序崩溃。

视图控制器

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

         if let cell = sender as? UICollectionViewCell,
            let indexPath = self.collectionView.indexPath(for: cell) {

             let vc = segue.destination as! DetailViewController //Cast with your DestinationController
             //Now simply set the title property of vc
             vc.titlePost.text = posts[indexPath.row].title // error Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
             vc.previewPost.text = posts[indexPath.row].preview_text
             
         }
    }

DetailViewController

class DetailViewController: UIViewController {
    
    private var fullPost: Detail?
    
    @IBOutlet weak var titlePost: UILabel!
    @IBOutlet weak var previewPost: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        postView()
    }
    
    private func postView() {
        titlePost.text = fullPost?.title
        titlePost.text = fullPost?.text
    }
}

如何解决这样的问题?

【问题讨论】:

  • let vc = segue.destination as! DetailViewController 这里vc 已经初始化,但是它的视图(以及它的所有子视图,比如你的IBOutlet titlePost)还没有被加载。所以vc.titlePost 是nil。既然你已经有一个fullPost 变量,不要将其设为私有,并将其设置为pepare(for:sender:):vc.fullPost = posts[indexPath.row],然后在你的viewDidLoad() 中你已经设置了标签值。

标签: ios swift


【解决方案1】:

你可能没有连接 IBOutlets,这两个

@IBOutlet weak var titlePost: UILabel!
@IBOutlet weak var previewPost: UITextView!

被标记为强制展开。您没有向我们显示崩溃日志,但我的猜测是 IBOutlet 中的一个或两个都没有链接到 xib 文件或故事板文件中的 UILabel 或 UITextView。

【讨论】:

    【解决方案2】:

    您不能通过 ViewController 的 prepareForSeque 方法在 DetailsViewController 中的 UIlabel 上设置文本。

    您只需要在 prepareForSeque 方法中执行此操作:

    if let cell = sender as? UICollectionViewCell,
                let indexPath = self.collectionView.indexPath(for: cell) {
    
                 let vc = segue.destination as! DetailViewController //Cast with your DestinationController
                 //Now simply set the title property of vc
             vc.fullPost = posts[indexPath.row]
                 
             }
    

    并且您需要删除 fullPost 变量的“私有”保护级别。它会起作用的。

    【讨论】:

    • 我有新错误:无法将“ArraySlice”类型的值分配给“Detail”类型,并且在调用下标时没有完全匹配
    • 我要为 fullPost 删除私有
    • 能否分享一下'posts'变量的声明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2020-02-03
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多