我正在继承UICollectionView
,并负责dataSource
。我在CollectionView的dataSource
阶段将self
分配给init
。
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()
}
}
CollectionViewSubclass
中使用UIViewController
时,一切正常,并且dataSource
方法(numberOfItemsInSection
和cellForItemAt
都被正确调用。 CollectionViewSubclass
内使用UICollectionViewController
时,由于某种原因未调用dataSource
方法,但在我调试时,我检查了{{1}确实被称为init(coder:)
被执行了。但似乎不知何故,dataSource在稍后阶段再次获得dataSource = self
,因此未调用nil
方法。 我无法理解这一点,我试图调试,但无济于事。任何帮助告诉我原因,或给我调试的想法,赞赏。谢谢!
修改:当我在dataSource
阶段之后指定dataSource = self
时,一切正常。但我宁愿在init
阶段这样做。如何在init
期间使其正常工作?
答案 0 :(得分:1)
来自UICollectionViewConrtoller
docs:
从storyboard或nib文件加载集合视图时,将从nib文件中获取集合视图的数据源和委托对象。如果未指定数据源或委托,则集合视图控制器将自己分配给未指定的角色。
因此,如果您使用UICollectionViewConrtoller
,则需要将dataSource重新分配到自定义集合视图。