致命错误:意外地发现零,而解包一个可选值
我在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.h
的dequeueReusableCellWithIdentifier
方法签名中看到,返回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中,所有分配给相同类的视图控制器都必须引用您在其中的代码,否则会出现错误。 如果你有两个不同的视图控制器不同的代码,分配给不同的类。 这对我有用,并希望适用于你在做什么。
致命错误:意外地发现零,而解包一个可选的值
- 检查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缺乏一个标识符。