我在Swift中实现了自定义UICollectionViewCell
类,使用UICollectionViewCotroller创建了故事板,分配了我的自定义控制器类,自定义单元格类,单元格ID等......基本上,使UICollectionViewController工作所需的一切。
在storyboard单元格原型中,我添加了一些视图,并将它们作为IBOutlets连接到我的自定义单元格类:
这里是我的IBOutlets代码(如你所见,它们是连接的):
我也在我的控制器中注册了自定义单元类:
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没有初始化的任何想法?
答案 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都匹配?