从nib加载UICollectionViewCell而不重用

Fre*_*ust 0 ios uicollectionview swift

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

我遇到的问题是,当明白地加载单元格时:

let cell = MyCustomCell()
Run Code Online (Sandbox Code Playgroud)

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

cell.awakeFromNib() and/or layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*nff 6

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

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

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

    var notReusableCell:CellTableViewCell?
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在viewDidLoad 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 }

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