UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?
Posted
技术标签:
【中文标题】UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?【英文标题】:What's wrong with register(_:forCellWithReuseIdentifier:) on UICollectionView?UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有什么问题? 【发布时间】:2017-05-22 06:05:12 【问题描述】:我正在使用UICollectionView
。正如dequeueReusableCell(withReuseIdentifier:for:)
所期望的那样您必须在调用此方法之前使用register(_:forCellWithReuseIdentifier:)
方法注册一个类或nib 文件,我在viewDidLoad
func 中添加了一行
self.collectionView!.register(PhotoCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
现在,当我使用单元进行出列和配置时,我遇到了错误并且应用程序崩溃了。
致命错误:在展开可选值时意外发现 nil
这是我的 DataSource 方法:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier,
for: indexPath) as! PhotoCollectionViewCell
let aPhoto = photoForIndexPath(indexPath: indexPath)
cell.backgroundColor = UIColor.white
cell.imageView.image = aPhoto.thumbnail //this is the line causing error
return cell
这是我的PhotoCollectionViewCell
课程
class PhotoCollectionViewCell: UICollectionViewCell
@IBOutlet weak var imageView: UIImageView! //I double checked this IBOutlet whether it connects with Storyboard or not
原始问题
现在是有趣的部分。
我在UICollectionView
中使用prototype
单元格,并从属性检查器 设置了一个reusable identifier
。我还将 custom class 从 identity inspector 更改为我的 PhotoCollectionViewCell
。
我搜索了同样的问题,发现使用原型单元格时,删除
self.collectionView!.register(PhotoCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
来自代码将起作用。我试了一下,效果很好。
但我很想知道这个问题背后的原因。我无法用
UITableView
重现同样的问题,但用UICollectionView
。
不可能重复:
这个UICollectionView's cell registerClass in Swift是关于如何在UICollectionView
注册课程的。但我的问题并不指望如何注册。我的问题是关于 UITableView
类但仅限于 UICollectionView
的问题。我期待这个冲突问题之间的实际差异。
【问题讨论】:
您是否在情节提要的单元格中添加了单元格标识符?? @AbhishekThapliyal,是的!我也提到了这一点。 你是否使用了单独的 xib 和自定义类? 原型单元自动连接。如果您为相同的标识符注册类,您会覆盖该连接但不会加载任何视图,因此出口将保持为零。您不能以编程方式连接情节提要单元。 @KKRocks 我使用了prototype cell
,但使用了自定义类。
【参考方案1】:
有 3 种方法可以注册单元格(UITableView
或 UICollectionView
)。
您可以注册课程。这意味着该单元没有笔尖或情节提要。不会加载任何 UI,也不会连接插座,只会自动调用类初始化程序。
您可以注册UINib
(即xib
文件)。在这种情况下,从 xib 加载单元 UI 并连接插座。
您可以在情节提要中创建原型单元格。在这种情况下,单元会自动为特定的UITableViewController
或UICollectionViewController
注册。在任何其他控制器中都无法访问该单元格。
这些选项不能组合。如果情节提要中有单元原型,则无需再次注册,如果这样做,您将断开情节提要连接。
【讨论】:
这就是我需要知道的。我使用了 register 方法(文档说你应该,模板提供了存根),我所有的 outlet 都是 nil。删除“必要”的方法,它起作用了。【参考方案2】:您可以使用如下标识符将 Nib 分配给 Collection 视图单元格:
self.collectionView.register(UINib(nibName: "nibName", bundle: nil), forCellWithReuseIdentifier: "cell")
希望对你有帮助。
【讨论】:
以上是关于UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 3GS 上的 iOS 6.0 上的 UICollectionView 崩溃