从nib加载UICollectionViewCell而不重用

时间:2017-06-15 02:28:35

标签: ios swift uicollectionview

我有一个带有nib的自定义UICollectionViewCell,我想在UICollectionView的cellForItemAt方法中加载,但没有从集合视图的dequeueReusableCell方法中获取/实例化单元格。

我遇到的问题是明确加载单元格时如:

let cell = MyCustomCell()

它的IB属性没有加载,我也尝试过调用:

cell.awakeFromNib() and/or layoutIfNeeded()

没有效果。我可以使用dequeue方法从IB加载视图,但如上所述,不能使用它。

我在视图控制器的viewDidLoad中正确注册了nib,其中包含集合视图:

let name = String(describing: MyCustomCell.self)
collectionView.register(
    UINib(
        name: name,
        bundle: nil),
    forCellWithReuseIdentifier: "customCell")

1 个答案:

答案 0 :(得分:6)

IBOutlets没有处理您的MyCustomCell实例的原因是因为只实例化了类而不是xib / nib。 当您在tableView中注册一个单元格然后将该单元格出列时,这两个单元格都会被初始化,并且会发生魔法。

如果你真的想在不使用tableview的dequeue方法的情况下加载单元格,那么你可以这样做:

  1. 创建一个UITableViewCell自定义类的var,在本例中是MyCustomCell

    var notReusableCell:CellTableViewCell?
    
  2. 在viewDid中加载nib并获取你想要的视图,在这种情况下,我们希望单元格成为第一个视图。

    let nib = Bundle.main.loadNibNamed("CellTableViewCell", owner: self, options: nil) notReusableCell = nib?.first as! CellTableViewCell?

  3. 现在,在您的cellForRowAt方法中,传递存储在var

    中的单元格

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = notReusableCell else { return CellTableViewCell() } return cell }

  4. 请修改你要做的事,因为这种做法并不常见。