致命错误: 在取消包装可选值时意外发现 nil

我在 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

269945 次浏览

您可以通过使用 if let语句安全地展开 cell.labelTitle来防止崩溃的发生。

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

不过,您仍然需要进行一些调试,以查看为什么会得到一个空值。

我不知道这是错误或东西,但您的标签和其他 UI 不会自动初始化时,您使用自定义单元格。你应该在 UICollectionViewController课上试试这个。这招对我很管用。

override func viewDidLoad() {
super.viewDidLoad()


let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}

我也有这个问题,问题出在视图控制器上。我不确定您的应用程序是如何构造的,所以我只是解释我发现了什么。我对 xcode 和代码还是个新手,所以请忍耐一下。

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

简而言之,在 Swift 中,分配给同一个类的所有视图控制器都必须引用其中的代码,否则就会得到一个错误。如果您有两个具有不同代码的不同视图控制器,请将它们分配给不同的类。这对我很有效,希望也适用于你正在做的事情。

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

我们可以从 dequeueReusableCellWithIdentifierUITableView.h方法签名中看到返回类型是 隐式取消包装可选项:

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

这是由美国广播公司第0季度之后的叹号决定的:

    AnyObject!

那么,首先要考虑的是,什么是“隐式取消包装的可选项”?

快速编程语言 告诉我们:

有时,从程序的结构中可以清楚地看出,一个可选的意愿 总是有一个值,在该值首次设置之后。在这些情况下,它 有助于消除检查和打开可选值的需要 每次访问它时,因为可以安全地假定它有一个 珍惜所有的时间。

这些类型的选项被定义为隐式展开 编写一个隐式取消包装的可选项 叹号(字符串!)而不是问号(字符串?) 要使其成为可选的类型。

所以,基本上,某些东西可能一度为零,但从某一点开始就不再为零了。因此,我们把它当作未包装的值来处理,从而省去了一些麻烦。

在这种情况下,dequeueReusableCellWithIdentifier返回这样的值是有意义的。提供的标识符 必须已经用于注册单元格以便重用。提供一个不正确的标识符,队列找不到它,运行时返回一个永远不应该发生的 nil。这是一个致命的错误,应用程序崩溃,控制台输出结果如下:

fatal error: unexpectedly found nil while unwrapping an Optional value

中指定的单元格重用标识符。故事板,Xib,或在代码,并确保它是正确的时候排队。

我自己也在寻找解决办法。只有我的问题是关于 UITableViewCell 而不是 UICollectionView,正如你在这里提到的。

首先,我是 iOS 开发的新手。喜欢全新的,坐在这里试图通过我的第一个教程,所以不要采取我的话为任何事情。(除非有效;)

我得到了一个零参考 cell.detailTextLabel.text-后重新看了教程视频我正在下面,它并不像我已经错过了什么。所以我输入了 UITableViewCell 的头文件并找到了这个。

文本标签: UILabel!{ get }//default 为零。如果需要,将创建 label (并且当前样式支持详细标签)。

所以我注意到它说(和当前的样式支持一个详细标签)-嗯,自定义样式没有一个详细标签默认在那里。所以我只需要改变故事板中的单元格的样式,一切都很好。

我猜你的标签应该一直在那里?

所以如果你接下来 Connor 的建议,基本上就是说,如果那个标签可用,那就使用它。如果您的样式设置正确,并且重用标识符与故事板中的设置相匹配,则不必进行此检查,除非您使用了多个自定义单元格。

检查该单元格是否注册了 self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)。如果注册了,那么删除该行代码。

更多信息见下面的答案: 为什么 UICollectionViewCell 的插座为零?

“如果你在使用故事板,你不会想把它叫做。它将覆盖你在故事板中的内容。”

我在试图访问 UILabel的时候发现了他的错误。我忘了连接 UILabelIBOutlet在故事板,这是造成应用程序崩溃与这个错误! !

也可以使用零聚合算子。

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

换掉这条线 cell.labelTitle.text = "This is a title"
cell.labelTitle?.text = "This is a title"

致命错误: 在取消包装可选值时意外发现 nil

  1. 检查 IBOutlet 集合,因为此错误有可能导致 uielement 对象的未连接使用。

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

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

我在 Xcode 7.3上遇到过同样的问题。我的解决办法是确保我的细胞有正确的 重用标识符。在 表格视图部分表格视图部分下将 表格视图单元格表格视图单元格设置为您在程序中使用的相应标识符名称 确保它们匹配

信息是一样的,但原因不同。我有一个 UIBarButton推动了一个转折。接口没有标识符。