已连接的IBOutlet未初始化

时间:2014-08-06 00:00:37

标签: ios swift uistoryboard xcode-storyboard

我在Swift中实现了自定义UICollectionViewCell类,使用UICollectionViewCotroller创建了故事板,分配了我的自定义控制器类,自定义单元格类,单元格ID等......基本上,使UICollectionViewController工作所需的一切。

在storyboard单元格原型中,我添加了一些视图,并将它们作为IBOutlets连接到我的自定义单元格类:

enter image description here

这里是我的IBOutlets代码(如你所见,它们是连接的): enter image description here

我也在我的控制器中注册了自定义单元类:

self.collectionView.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

当我在代码中将单元格出列时,它返回我的自定义类型的单元格,但两个IBOutlet都没有初始化(等于nil

    let cell = collectionView?.dequeueReusableCellWithReuseIdentifier(reuseIdentifier,
    forIndexPath: indexPath) as MyCollectionViewCell

    if let path = indexPath {
        // Crash here as imageView is nil
        cell.imageView.image = imagesArray[path.item] 
    }

崩溃日志:

fatal error: unexpectedly found nil while unwrapping an Optional value

如果我在上面的if语句中放置断点并执行po cell我有此输出:

(lldb) po cell
0x00007fa799f4cdf0
 {
  UIKit.UICollectionViewCell = {
    UIKit.UICollectionReusableView = {
      UIKit.UIView = {
        UIKit.UIResponder = {
          ObjectiveC.NSObject = {}
        }
      }
    }
  }
  selectionView = nil
  imageView = nil
}

为什么IBOutlets没有初始化的任何想法?

4 个答案:

答案 0 :(得分:1)

我在Beta5中遇到了同样的问题,尽管xib不是故事板。 在xib的情况下,它似乎是

的问题
init(nibName: nil, bundle: nil) 

没有获取默认的xib文件名。当我改为显式的nibName

init(nibName: "MyClass", bundle: nil) 
然后它又开始工作了。与故事板有同样的问题 - 如果有办法强制使用故事板名称,我会试试。

答案 1 :(得分:1)

之所以发生这种情况,是因为在initWithCoder完成后,IBOutlets会在以后连接。

要在控件连接后设置控件,您可以覆盖- applyLayoutAttributes:子类中的UIColletionViewCell

override func applyLayoutAttributes(layoutAttributes: UICollectionViewLayoutAttributes) {
    setupControls()
}

根据文档,它是一个空方法,意味着要重写以便将自定义布局属性应用于视图。听起来很对。

答案 2 :(得分:1)

好吧,我也遇到了这个问题,我的问题通过评论注册api of collection view 来解决,如下面的代码片段所示。我相信我们正在使用故事板。我们已经提供了所有信息,如(班级,出口和标识符)。所以故事板处理这一切。

func configureCollectionView(isNib:Bool = false)
{
    if isNib
    {
        //collectionView.register(UINib(nibName: "GalleryCell", bundle:nil), forCellWithReuseIdentifier: identifier)
    }
    else
    {
        //collectionView.register(PhotoCell.self,forCellWithReuseIdentifier:identifier);
    }

}

答案 3 :(得分:0)

如果这是beta 4或5,并且我认为它是基于IBOutlets是可选的,你是否在类中重写了initWithCoder?即使是一个只能打电话给超级的人?缺少这可能是你的问题。

编辑:您是否尝试确保在故事板和代码中所有的reuseIdentifiers都匹配?