致命错误:在展开可选值时意外找到零

致命错误:在展开可选值时意外找到零

我用的是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}

有人知道这件事吗?


当年话下
浏览 692回答 3
3回答

守着一只汪

几乎可以肯定的是,您的重用标识符"title"是不正确的。我们可以从UITableView.h方法签名dequeueReusableCellWithIdentifier返回类型为隐式解封可选: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编程语言告诉我们:有时,从程序的结构中可以清楚地看到,在第一次设置该值之后,可选项总是有一个值。在这些情况下,每次访问可选值时都需要检查和打开它,因为可以安全地假定它一直都有一个值。这类选项被定义为隐式展开选项。您可以通过放置感叹号(字符串!)来隐式地编写未包装的可选项。而不是问号(字符串?)在要选择的类型之后。所以,基本上,在某一点上可能是零的,但从某一点开始,它就不再是零了。因此,我们把它作为未包装的值,省去了一些麻烦。在这种情况下dequeueReusableCellWithIdentifier返回这样的值提供的标识符必须已用于注册单元以便重用。提供一个不正确的标识符,去队列找不到它,运行时返回一个不应该发生的零。这是一个致命的错误,应用程序崩溃,控制台输出提供:fatal error: unexpectedly found nil while unwrapping an Optional value底线:检查.storyboard、XIB或代码中指定的单元重用标识符,并确保它在退出队列时是正确的。

大话西游666

您可以通过安全地展开包装来防止崩溃的发生。cell.labelTitle带着if let声明。if let label = cell.labelTitle{     label.text = "This is a title"}但是,您仍然需要进行一些调试,以了解为什么要在那里获得一个零值。

BIG阳

检查该单元格是否正在注册。self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)..如果是,那么删除这一行代码。有关更多信息,请参见此答案:为什么UICollectionViewCell的出口为零?“如果你使用的是故事板,你不想叫它。它会覆盖你的故事板。”
打开App,查看更多内容
随时随地看视频慕课网APP