为什么cell.ImageView?.image如果已通过图像则为零?与Swift中的选项混淆

时间:2015-02-04 22:49:47

标签: ios swift uiimage uicollectionviewcell

我再也无法想到它了,请帮助我了解这里发生了什么:

所以我有一些我想在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教程完全相同的一切。拜托,给我一些线索 - 我陷入困境

2 个答案:

答案 0 :(得分:2)

OMG我在viewDidLoad()

中注释掉了
self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) 

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

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

答案 1 :(得分:0)

如果您使用以下内容,它应该有效:

cell.imageC.image = currentImage

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

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