Ios 致命错误:在展开可选值时意外发现nil

Ios 致命错误:在展开可选值时意外发现nil,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我在Swift中使用了一个UICollectionView,但是当我试图更改单元格标签的文本时,我得到了它 func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int { return 5 } func collectionView(collectionView: UICollectionView!, cellForItemAtInde

我在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
}
有人知道这件事吗


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

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

您仍然需要进行一些调试,以了解为什么会得到一个nil值。

我不知道这是bug还是什么,但是当您使用自定义单元格时,标签和其他UI不会自动初始化。您应该在
UICollectionViewController
类中尝试此操作。这对我有用

override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
    self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}
override func viewDidLoad(){
super.viewDidLoad()
让nib=UINib(nibName:,bundle:nil)
self.collectionView.registerNib(nib,强制重用标识符:“标题”)
}

我也遇到了这个问题,问题出在视图控制器上。我不确定你的应用程序是如何构造的,所以我只解释一下我的发现。我对xcode和编码相当陌生,所以请耐心听我说

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


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

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

我们可以从
dequeueReusableCellWithIdentifier
UITableView.h
方法签名中看到,返回类型是一个隐式展开的可选

func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
这是由
AnyObject
后面的感叹号决定的:

    AnyObject!

这样,首先要考虑的是,什么是“隐式展开的可选”?< /P> 告诉我们:

有时,从程序的结构可以清楚地看出,一个可选的 始终有一个值,在第一次设置该值之后。在这些情况下 有助于消除检查和展开可选值的需要 每次访问它时,因为可以安全地假定它具有 永远珍惜

这些类型的选项定义为隐式展开 可选。通过放置 后面是感叹号(字符串!),而不是问号(字符串?) 要使其成为可选的类型

所以,基本上,有些东西在某一点上可能是零,但从某一点上,它再也不会是零了。因此,通过将其作为未包装的值,我们可以省去一些麻烦

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

fatal error: unexpectedly found nil while unwrapping an Optional value

底线:检查在.storyboard、Xib或代码中指定的单元重用标识符,并确保它在退出队列时是正确的。我自己到处寻找解决方案。只有我的问题与UITableViewCell有关,而不是您在这里提到的UICollectionView

首先,我是iOS开发新手。就像全新的一样,坐在这里试图通过我的第一个教程,所以不要相信我的话。(除非其工作正常;)

我得到了一个对
cell.detailTextLabel.text
的零引用-在重新观看了我正在关注的教程视频后,看起来我没有错过任何东西。因此,我输入了UITableViewCell的头文件并找到了这个

var detailtextlab:UILabel!{get}//默认值为零。必要时将创建标签(当前样式支持详图标签)。

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

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


所以,如果你听从康纳的建议,这基本上意味着,如果这个标签是可用的,那么就使用它。如果您的样式设置正确,并且重用标识符与故事板中的设置匹配,则不必执行此检查,除非您使用多个自定义单元格。

检查单元格是否已注册到
self.collectionView.registerClass(cellClass:AnyClass?,forCellWithReuseIdentifier标识符:String)
。如果是,则删除该行代码

有关更多信息,请参阅此答案:


“如果您使用的是情节提要,您不想调用此功能。它将覆盖您在情节提要中的内容。”

我在尝试访问
UILabel
时遇到了他的错误。我忘记在情节提要中将
UILabel
连接到
IBOutlet
,这导致应用程序因此错误而崩溃

Nil聚结算子也可以使用

rowName = rowName != nil ?rowName!.stringFromCamelCase():""
更换这条线
cell.labelTitle.text=“这是一个标题”

具有
cell.labelTitle?.text=“这是一个标题”

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

  • 检查IBOutlet集合,因为此错误有可能导致未连接的uielement对象使用
    :)希望它能帮助一些挣扎的人

    我也有同样的问题,原因是我想