我正在子类化UICollectionView
,并照顾它的dataSource
。我在 CollectionView 的init
阶段将dataSource
分配给self
。
import Foundation
import UIKit
class CollectionViewSubclass: UICollectionView, UICollectionViewDataSource {
public override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
super.init(frame: frame, collectionViewLayout: layout)
dataSource = self
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
dataSource = self
}
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// This is called for the first case, but not the second
return 1
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// This is called for the first case, but not the second
return UICollectionViewCell()
}
}
- 情况 1:当我在
UIViewController
中使用CollectionViewSubclass
时,一切正常,dataSource
方法(numberOfItemsInSection
和cellForItemAt
都正确调用。 - 情况2:当我在
UICollectionViewController
中使用CollectionViewSubclass
时,由于某种原因,没有调用dataSource
方法,尽管在调试时,我检查了init(coder:)
确实被调用并且dataSource = self
被执行。但似乎不知何故,数据源在稍后阶段再次nil
,因此没有调用dataSource
方法。
我无法解决这个问题,我试图调试,但无济于事。任何帮助告诉我原因,或给我调试的想法,这是值得赞赏的。谢谢!
编辑:当我在init
阶段后分配dataSource = self
时,一切正常。但我宁愿在init
阶段这样做。如何在init
期间使其工作?
来自UICollectionViewConrtoller
文档:
从情节提要或 nib 文件加载集合视图时,将从 nib 文件中获取集合视图的数据源和委托对象。如果未指定数据源或委托,则集合视图控制器会将自身分配给未指定的角色。
因此,如果使用UICollectionViewConrtoller
则需要将 dataSource 重新分配给自定义集合视图。