为什么 cell.ImageView?.image 如果传递了图像,则为 nil?与 Swift 中的选项混淆

Why cell.ImageView?.image is nil if have passed an image? Confused with optionals in Swift

我实在想不起来了,请帮我理解这是怎么回事:

所以我有一个图像资产,我想在 UICollecionView 中查看。 我有一组图像名称和文件名,所以在 collectionView:cellForItemAtIndexPath: 函数中我做了

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

    let currentPhoto = photos[indexPath.row]
    let currentImage = UIImage(named: currentPhoto.filename)

    cell.imageC?.image = currentImage

    println("collectionView:cellForItemAtIndexPath:\(indexPath.row)")
    println(currentPhoto.filename)

    println("currentImage \(currentImage!.imageAsset)")
    println("cell.image \(cell.imageC?.image)")
    return cell

imageC 在

中定义
class ImageCell: UICollectionViewCell {

@IBOutlet weak var imageC: UIImageView!

}

所以我看到 currentImage 正确获取图像。 Println 给了我这个:

currentImage <UIImageAsset: 0x7fead1e55790>

然而,cell.imageC?.image 为零!为什么?我对可选值感到困惑,并没有真正理解包装-展开变量和常量的想法,但在这里我所做的一切都与 TableView 教程中的完全相同。请给我一些线索 - 我被困在泥里了

如果您使用以下内容,它应该可以工作:

cell.imageC.image = currentImage

在您的 ImageCell class 中,您将图像定义为 UIImageView! 该感叹号基本上表示您没有初始化变量,但它在被引用之前会包含一些东西。不是可选的。

swift 中的可选项的存在是为了让代码更安全。它引入了一个概念,即没有常量或任何变量包含 nil 因为它会在访问时抛出错误。相反,如果变量中可能没有任何内容,您可以将其标记为可选。该可选标志有点像布尔值,表示变量中是否有内容。一旦你检查变量是否不为 nil,然后解包它,你就会得到它的内容。

天哪,我在 viewDidLoad() 中注释掉了

self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) 

成功了!我不确定为什么,但作为临时解决方案,它对我来说效果很好。

奇怪的是,如果您尝试创建新的 UIViewCollectionController,这行代码是默认 viewDidLoad() 方法的一部分 class