如何解决具有自定义集合视图布局的可扩散数据源?
Here我创建了一个示例应用程序,该应用程序使用具有可自定义集合视图布局的集合视图的可扩散数据源。我使用的具体布局来自this教程。
如果您不想克隆存储库并自己尝试,则这里是代码的相关部分。
import UIKit
let cellIdentifier = "testRecordCell"
struct Record:Hashable {
let identifier = UUID()
func hash(into hasher: inout Hasher) {
hasher.combine(identifier)
}
static func == (lhs: Record,rhs: Record) -> Bool {
return lhs.identifier == rhs.identifier
}
var timeStamp: Date
init(daysBack: Int){
self.timeStamp = Calendar.current.date(byAdding: .day,value: -1*daysBack,to: Date())!
}
}
class Cell:UICollectionViewCell {
}
class Section: Hashable {
var id = UUID()
// 2
var records:[Record]
init(records:[Record]) {
self.records = records
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
static func == (lhs: Section,rhs: Section) -> Bool {
lhs.id == rhs.id
}
}
extension Section {
static var allSections: [Section] = [
Section(records: [
Record(daysBack: 5),Record(daysBack: 6)
]),Section(records: [
Record(daysBack: 3)
])
]
}
class ViewController: UICollectionViewController {
private lazy var dataSource = makeDataSource()
private var sections = Section.allSections
fileprivate typealias DataSource = UICollectionViewDiffableDataSource<Section,Record>
fileprivate typealias DataSourceSnapshot = NSDiffableDataSourceSnapshot<Section,Record>
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView?.register(Cell.self,forCellWithReuseIdentifier: cellIdentifier)
applySnapshot()
if let layout = collectionView.collectionViewLayout as? PinterestLayout {
layout.delegate = self
}
}
}
extension ViewController {
fileprivate func makeDataSource() -> DataSource {
let dataSource = DataSource(
collectionView: self.collectionView,cellProvider: { (collectionView,indexPath,testRecord) ->
UICollectionViewCell? in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier,for: indexPath)
cell.backgroundColor = .black
return cell
})
return dataSource
}
func applySnapshot(animatingDifferences: Bool = true) {
// 2
var snapshot = DataSourceSnapshot()
snapshot.appendSections(sections)
sections.forEach { section in
snapshot.appendItems(section.records,toSection: section)
}
//This part errors out: "request for number of items in section 0 when there are only 0 sections in the collection view"
dataSource.apply(snapshot,animatingDifferences: animatingDifferences)
}
}
extension ViewController: PinterestLayoutDelegate {
func collectionView(_ collectionView: UICollectionView,heightForPhotoAtIndexPath indexPath: IndexPath) -> CGFloat {
return CGFloat(10)
}
}
以某种方式,布局未注册到集合视图中确实包含项和节的信息。正常运行时,尝试应用快照时会出错:“当集合视图中只有0个部分时,请求0部分中的项目数”
然后,在Pinterest布局的prepare()函数中,当我设置一个断点并检查collectionView.numberOfSections()时,它返回0。因此,快照无法与集合视图进行通信。注意,我从未使用过collectionView的委托方法numberOfSections,因为我使用的是可扩散数据源...
我的印象是,尽管我在任何地方都没有看到这是必需的,但通常将散布数据源用于合成布局。
那么有什么办法吗?
解决方法
问题是这一行:
true
将false
更改为{{1}},您将不再崩溃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。