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 classidentity 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 种方法可以注册单元格(UITableViewUICollectionView)。

    您可以注册课程。这意味着该单元没有笔尖或情节提要。不会加载任何 UI,也不会连接插座,只会自动调用类初始化程序。

    您可以注册UINib(即xib 文件)。在这种情况下,从 xib 加载单元 UI 并连接插座。

    您可以在情节提要中创建原型单元格。在这种情况下,单元会自动为特定的UITableViewControllerUICollectionViewController 注册。在任何其他控制器中都无法访问该单元格。

这些选项不能组合。如果情节提要中有单元原型,则无需再次注册,如果这样做,您将断开情节提要连接。

【讨论】:

这就是我需要知道的。我使用了 register 方法(文档说你应该,模板提供了存根),我所有的 outlet 都是 nil。删除“必要”的方法,它起作用了。【参考方案2】:

您可以使用如下标识符将 Nib 分配给 Collection 视图单元格:

self.collectionView.register(UINib(nibName: "nibName", bundle: nil), forCellWithReuseIdentifier: "cell")

希望对你有帮助。

【讨论】:

以上是关于UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何捕捉 UICollectionView 上的手势?

UICollectionview 上的圆角而不是单个单元格

iPhone 3GS 上的 iOS 6.0 上的 UICollectionView 崩溃

UICollectionView 上的可重用性问题

iOS 14 上的 UICollectionView 列表布局问题

部分之间的多个自定义 TableviewCell 上的多个自定义 UICollectionView