【问题标题】:Unexpectedly found nil for optional value - which is not nil after optional chaining意外发现可选值的 nil - 在可选链接之后不是 nil
【发布时间】:2016-03-16 21:17:39
【问题描述】:

我在 CoreData 中有一组图像,这些图像在主视图控制器中获取和使用,然后传递给详细视图控制器,然后再传递给容器视图控制器。图像在 Master 和 Detail 控制器中成功显示,但不是 Container View Controller。

在容器视图控制器中,我使用条件绑定来解开 cellForItemAtIndexPath 中的图像。

在调试器中,加载时 print("did 实际上:(images.count)") 显示我在数组中有一个图像,并且 imageForCell 不是 nil - 它是一个 UIImage - 但是,我仍然意外发现nil 同时展开 Optional 值...

【问题讨论】:

  • 你检查了 cell 和 cell.cellImageView 我希望不是 nil 吗?
  • 啊哈 - cellImageView 为零!我需要做什么来实例化视图?
  • 我的单元格是一个自定义单元格,但除了 cellImageView 的出口之外,它是空的。我尝试了一个方便的 init 和其他方法来将出口初始化为 UIImageView(),但 cell.cellImageView 保持为零!
  • 这将根据您使用的是故事板还是笔尖而有所不同。我的建议是谷歌它:)
  • 删除该行后是否有效?还是现在单元格为零?

标签: swift uiimage uicollectionview


【解决方案1】:

所以要回答这个问题,首先要检查什么是 nil。你假设你解包的值是 nil,但你的 view 实际上是 nil。

提示:使用 gaurd 语句。在保护语句中,您必须指定代码在错误情况下必须执行的操作。在 guard 语句之后,您可以使用解包后的值。当您的图像为零时,您当前的代码仅显示一个没有任何消息的空单元格。如果它不显示图像,您将不知道出了什么问题。

就我个人而言,我喜欢检查我的方法中所有可能的选项。这使方法变得烦人,但可以防止错误。我也喜欢指定对象的类型,但这完全取决于你。对我来说,主要是“UIImage”和“UIImage?”之间的区别。在您的情况下,UIImage 可能仍然为零。

继续您的下一个问题,为什么它仍然无法正常工作。因此,我查看了 UICollectionView 在从情节提要加载时如何初始化其单元格。人们说,在那些场景中手动使用 registerClass 时,它会覆盖从情节提要加载的视图。请参阅:How to set a UILabel in UICollectionViewCell。我要求你删除它,以证实我的怀疑。

我假设您只需要在不从情节提要或 nib/xib 加载视图时使用 registerClass。

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2016-10-18
    • 2017-04-09
    • 2018-09-22
    相关资源
    最近更新 更多