创建自定义集合视图 delegate/data 来源

Create custom collection view delegate/data source

我有一个名为 MyController 的控制器,它是 UIViewController。在控制器内部有 CollectionView。我们称它为 myCollectionView。我将如何创建自定义 CollectionViewDelegate 或 DataSource,以便我可以将它们用于 myCollectionView。我已经尝试创建自定义委托和数据源,但我的集合视图是空的。我发现实际上我的自定义委托和数据源的方法甚至没有被调用,这就是为什么我基本上看到一个空的集合视图。我试过的是:

final class MyController: UIViewController {
  private lazy var collectionView = methodCreatesCollectionView()

  private var items: [String]?
  private var customDataSource: CustomDataSource?

  init() {
    super.init(nibName: nil, bundle: nil)
    view.addSubview(collectionView)

    customDataSource = CustomDataSource(parent: self)
    collectionView.reloadData()
  }

  func fill(with items: [String]) {
    self.items = items
  }

  func methodCreatesCollectionView() -> UICollectionView {
    let cv = UICollectionView(
      frame: self.view.bounds
    )
    cv.dataSource = customDataSource
    return cv
  }
}

我的自定义数据源是什么样的

private class CustomDataSource: NSObject, UICollectionViewDataSource {
  weak var parent: MyController?

  init(parent: MyController) {
    self.parent = parent
  }

  func collectionView(
    _: UICollectionView,
    numberOfItemsInSection section: Int
  ) -> Int {
    guard let numberOfItems = parent?.items?.count else {
      return 0
    }
    return numberOfItems
  }

  func numberOfSections(
    in _: UICollectionView
  ) -> Int {
    return 1
  }
}

好吧,我发现了自己的错误。

如果有人像我一样这样做,请记住在第一次调用之前调用与集合视图相关的所有内容。

因此,在将集合视图添加到视图层次结构之前,您必须先初始化数据 source/delegate,因为它的创建方式是 惰性。所以它只会在第一次 accessed/called 时创建。