为什么 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
我实在想不起来了,请帮我理解这是怎么回事:
所以我有一个图像资产,我想在 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