创建自定义集合视图 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 时创建。
我有一个名为 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 时创建。