首页 文章

致命错误:在解包可选值时意外发现nil [重复]

提问于
浏览
120

这个问题在这里已有答案:

我在Swift中使用 UICollectionView 但是当我尝试更改单元格标签的文本时我得到了 .

func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
{
    return 5
}

func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
{
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("title", forIndexPath: indexPath) as TitleCollectionViewCell
    // Next line: fatal error: unexpectedly found nil while unwrapping an Optional value
    cell.labelTitle.text = "This is a title"
    return cell
}

有谁知道这个?

Screenshot for warning on Console

13 回答

  • 12

    我在Xcode 7.3上遇到了同样的问题 . 我的解决方案是确保我的细胞具有正确的 reuse identifiers . 在 table view section 下将 table view cell 设置为您在程序中使用的相应标识符名称 make sure they match .

  • 1

    我遇到了同样的问题,原因是因为我试图用错误的名称加载UIImage . 仔细检查 .setImage(UIImage(named: "-name-" 调用并确保名称正确 .

  • 0

    这里有相同的消息,但原因不同 . 我有一个 UIBarButton 推了一个segue . segue缺少一个标识符 .

  • 2

    也可以使用Nil Coalescing Operator .

    rowName = rowName != nil ?rowName!.stringFromCamelCase():""
    
  • 25

    几乎可以肯定,您的重用标识符 "title" 不正确 .

    我们可以从 dequeueReusableCellWithIdentifierUITableView.h 方法签名中看到返回类型是 Implicitly Unwrapped Optional

    func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
    

    这是由 AnyObject 之后的感叹号决定的:

    AnyObject!
    

    所以,首先要考虑的是,什么是“隐式解包可选”?

    The Swift Programming Language告诉我们:

    有时从程序的结构中可以清楚地看出,在首次设置该值之后,可选项将始终具有值 . 在这些情况下,每次访问时都不需要检查和解包可选的值,因为可以安全地假设它始终具有值 . 这些类型的选项被定义为隐式解包的选项 . 您可以通过在要使其成为可选类型之后放置感叹号(String!)而不是问号(String?)来编写隐式解包的可选项 .

    所以,基本上,某些东西可能在某一点上是零,但从某些角度来看,它永远不会再为零 . 因此,我们通过将其作为未包装的值来节省一些麻烦 .

    在这种情况下, dequeueReusableCellWithIdentifier 返回这样的值是有意义的 . 提供的标识符必须已用于注册单元以供重用 . 提供一个不正确的标识符,dequeue可能会发生致命错误,应用程序崩溃,并且控制台输出提供:

    fatal error: unexpectedly found nil while unwrapping an Optional value
    

    Bottom line: check your cell reuse identifier specified in the .storyboard, Xib, or in code, and ensure that it is correct when dequeuing.

  • 0

    您可以通过使用 if let 语句安全地解包 cell.labelTitle 来防止崩溃 .

    if let label = cell.labelTitle{
        label.text = "This is a title"
    }
    

    您仍然需要进行一些调试,以了解为什么在那里获得零值 .

  • 1

    检查单元格是否正在使用 self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String) 注册 . 如果是,则删除该行代码 .

    有关详细信息,请参阅此答案:Why is UICollectionViewCell's outlet nil?

    "If you are using a storyboard you don't want to call this. It will overwrite what you have in your storyboard."

  • 78

    我不知道它是错误还是其他什么,但是当您使用自定义单元格时,您的标签和其他UI不会自动初始化 . 你应该在你的 UICollectionViewController 课程中尝试这个 . 它对我有用 .

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
        self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
    }
    
  • 101

    替换此行 cell.labelTitle.text = "This is a title"
    cell.labelTitle?.text = "This is a title"

  • 6

    当我试图访问 UILabel 时,我收到了他的错误 . 我忘了在故事板中连接 UILabelIBOutlet ,这导致应用程序因此错误而崩溃!

  • 3

    我也有这个问题,问题出在视图控制器中 . 我不确定你的应用程序是如何构建的,所以我只会解释我发现的内容 . 我对xcode和编码很新,所以请耐心等待 .

    我试图以编程方式更改UILabel上的文本 . 使用“self.mylabel.text”工作正常,直到我在同一个类下添加另一个视图控制器,该控制器也没有包含该标签 . 那是我收到你所看到的错误的时候 . 当我添加相同的UILabel并将其连接到另外的视图控制器时,错误就消失了 .

    简而言之,似乎在Swift中,分配给同一个类的所有视图控制器都必须引用您在那里的代码,否则就会出错 . 如果您有两个具有不同代码的不同视图控制器,请将它们分配给不同的类 . 这对我有用,并希望适用于你正在做的事情 .

  • 19

    致命错误:在展开Optional值时意外发现nil

    • 检查IBOutlet集合,因为此错误将有机会未连接的uielement对象使用情况 .

    :)希望它能帮助一些挣扎的人 .

  • 1

    我自己四处寻找解决方案 . 只有我的问题与你在这里提到的UITableViewCell Not UICollectionView有关 .

    首先,我是iOS开发的新手 . 像全新的,坐在这里试图通过我的第一个教程,所以不要听我的话任何事情 . (除非它的工作;))

    我得到了一个零参考 cell.detailTextLabel.text - 重新学习我正在关注的教程视频后,它看起来并没有错过任何东西 . 所以我输入了UITableViewCell的头文件并找到了这个 .

    var detailTextLabel: UILabel! { get } // default is nil. label will be created if necessary (and the current style supports a detail label).

    所以我注意到它(并且当前样式支持细节标签) - 嗯,自定义样式默认情况下没有detailLabel . 所以我只需要在故事板中切换单元格的样式,一切都很好 .

    我猜你的标签应该永远在那里?

    因此,如果您的以下康纳的建议,这基本上意味着,如果该标签可用,那么使用它 . 如果您的样式设置正确并且重用标识符与Storyboard中设置的样式匹配,则除非您使用多个自定义单元格,否则不应进行此检查 .

相关问题