致命错误:意外地发现零,而解包一个可选值

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

有人知道吗?

控制台上的警告屏幕截图

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

我们可以从UITableView.hdequeueReusableCellWithIdentifier方法签名中看到,返回types是一个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! 

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

Swift编程语言告诉我们:

有时候从程序的结构中可以清楚地看到,在第一次设置值之后,可选项总是有一个值。 在这些情况下,每次访问时都不需要检查和打开可选的值,因为可以安全地假定所有的时间都有一个值。

这些选项被定义为隐含的解包选项。 你写一个隐式解开的可选项,在你想要的可选types之后放置一个感叹号(String!)而不是一个问号(String?)。

所以,基本上,这个东西可能一直是零,但是从某个angular度来说再也不是零。 因此,我们为自己节省了一些麻烦,把它作为解开的价值。

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

 fatal error: unexpectedly found nil while unwrapping an Optional value 

底线:检查在.storyboard,Xib或代码中指定的单元重用标识符,并确保在出列时它是正确的。

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

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

你仍然需要做一些debugging,看看为什么你在那里得到一个零值。

检查单元格是否正在使用self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String) 。 如果是这样,那么删除该行的代码。

为什么是UICollectionViewCell的出口零?

“如果你正在使用故事板,你不想调用它,它会覆盖你在故事板上的内容。”

我不知道是错误还是什么,但是当你使用自定义单元格时,你的标签和其他用户界面不会自动初始化。 你应该在你的UICollectionViewController类中试试这个。 它为我工作。

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

replace这一行cell.labelTitle.text = "This is a title"
with cell.labelTitle?.text = "This is a title"

当我试图访问UILabel时,我得到了他的错误。 我忘了将UILabel连接到Storyboard中的IBOutlet ,导致应用程序崩溃,并出现此错误!

我也遇到了这个问题,问题出在视图控制器中。 我不确定你的应用程序是如何构build的,所以我只是解释我发现的东西。 我很新的Xcode和编码,所以忍受着我。

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

简而言之,在Swift中,所有分配给相同类的视图控制器都必须引用您在其中的代码,否则会出现错误。 如果你有两个不同的视图控制器不同的代码,分配给不同的类。 这对我有用,并希望适用于你在做什么。

致命错误:意外地发现零,而解包一个可选的值

  1. 检查IBOutlet集合,因为这个错误将有机会不连接uielement对象的使用。

:)希望这将有助于一些挣扎的人。

我自己寻找解决scheme。 只有我的问题是相关的UITableViewCell不是UICollectionView你在这里提到。

首先,我是iOS开发新手。 像全新的,坐在这里试图得到槽我的第一个教程,所以不要听任我的话。 (除非它的工作;))

我得到了一个无参考cell.detailTextLabel.text – 重新观看教程video后,我跟着,它没有看起来像我错过了什么。 所以我进入UITableViewCell的头文件,并发现这一点。

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

所以我注意到它说(和当前样式支持一个细节标签) – 那么,自定义样式默认情况下没有一个detailLabel。 所以我只需要切换Storyboard中单元格的样式,一切都很好。

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

所以,如果你遵循connor的build议,基本上就是说,如果这个标签是可用的,那就使用它。 如果您的样式设置正确,并且重复标识符与Storyboard中设置的标识符相匹配,则不必执行此检查,除非您使用多于一个自定义单元格。

无合并操作员也可以使用。

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

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

我有同样的问题,原因是因为我试图加载一个错误名称的UIImage。 仔细检查.setImage(UIImage(named: "-name-" )并确保名称正确。

同样的信息在这里,但有不同的原因。 我有一个UIBarButton ,推了一个segue。 该segue缺乏一个标识符。