UICollectionViewCell类中的nil个出口有几个帖子,如this和this,但没有一个解决方案有效。使用强插座而不是弱插座失败,registerClass
解决方案不适用,因为单元不使用自定义XIB,数据源和代理连接正确等等。
在这种情况下,插座是UIImageView,在UICollectionViewCell类中访问时为nil,但在外部访问时工作正常。
UICollectionView代码:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(AlbumCellIdentifier, forIndexPath: indexPath) as! AlbumCell
cell.imageView.image = getThumbnail()
cell.imageView.contentMode = .ScaleAspectFill
cell.imageView.layer.masksToBounds = true
cell.imageView.layer.cornerRadius = cell.frame.size.width / 2
return cell
}
UICollectionViewCell代码:
class AlbumCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
doInit(frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
doInit(frame)
}
private func doInit(frame: CGRect) {
// Round corners
imageView.layer.masksToBounds = true
imageView.layer.cornerRadius = frame.size.width / 2
}
}
UICollectionViewCell类内的圆角失败,因为imageView
为零,但UICollectionView类内的圆角成功,因此imageView
似乎已连接。
为什么imageView
在UICollectionViewCell类中没有?
答案 0 :(得分:3)
您可能想尝试在doInit
中调用awakeFromNib
但是我认为该框架可能尚未初始化(虽然没有测试):
override func awakeFromNib() {
super.awakeFromNib()
doInit(frame)
}
由于您要根据视图的框架更新cornerRadius
,我会在layoutSubviews
中执行此操作,因此任何帧更改都将直接反映到角半径值:
override func awakeFromNib() {
super.awakeFromNib()
imageView.layer.masksToBounds = true
}
override func layoutSubviews() {
super.layoutSubviews()
imageView.layer.cornerRadius = frame.size.width / 2
}
更新:由于您说过,您不使用nib文件加载视图,只需将imageView.layer.masksToBounds = true
移至init(frame: CGRect)
并删除awakeFromNib
。