我正在尝试使用
DiffableDataSource
集合视图,我不断收到此错误
Fatal: supplied item identifiers are not unique. Duplicate identifiers
这是我的实现方式
extension UICollectionView {
enum Section {
case main
}
}
class FeedsCollectionView: View {
var collectionView: UICollectionView! = nil
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
typealias DataSource = UICollectionViewDiffableDataSource<UICollectionView.Section, Scraper>
typealias DataSourceSnapshot = NSDiffableDataSourceSnapshot<UICollectionView.Section, Scraper>
private var dataSource : DataSource!
private var snapshot: DataSourceSnapshot!
public lazy var data: [Scraper] = [] {
didSet {
applySnapshot()
}
}
private func configureDataSource() {
dataSource = DataSource(collectionView: collectionView, cellProvider: { (collectionView, indexPath, data) in
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "feeds", for: indexPath) as? FeedsCollectionViewCell {
cell.configure(with: data)
cell.eventHandler = { [weak self] events in
switch events {
case .reload:
self?.applySnapshot()
}
}
return cell
}
return UICollectionViewCell()
})
applySnapshot()
}
public func applySnapshot() {
snapshot = DataSourceSnapshot()
snapshot.appendSections([UICollectionView.Section.main])
snapshot.appendItems(data)
dataSource.apply(snapshot, animatingDifferences: true)
}
private func createLayout() -> UICollectionViewLayout {
return UICollectionViewCompositionalLayout { section, layoutEnvironment in
var config = UICollectionLayoutListConfiguration(appearance: .sidebar)
config.headerMode = section == 0 ? .none : .firstItemInSection
return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)
}
}
private func configureHierarchy() {
collectionView = UICollectionView(frame: bounds, collectionViewLayout: createLayout())
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.register(FeedsCollectionViewCell.self, forCellWithReuseIdentifier: "feeds")
addSubview(collectionView)
}
override func setupUI() {
configureHierarchy()
configureDataSource()
}
override func setupLayout() {
LayoutConstraint.pin(to: .bounds, collectionView).activate()
}
}
这里是 scrapper 类(其中一部分):
public class Scraper: Hashable {
let id = UUID()
public func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
public static func == (lhs: Scraper, rhs: Scraper) -> Bool {
lhs.id == rhs.id
}
Scraper 类要大得多,我无法使其成为结构。如何修复此错误 非常感谢你
看起来你一遍又一遍地添加相同的项目......
我也有同样的问题。由于某种原因,它从 iOS 18.0.1 开始一直在复制(可能是他们用多线程更新了一些东西)。
无论如何,这里的主要修复是确保您没有将重复项添加到您的
data
数组中(我们知道数组默认情况下没有提供它,与 set 相比)。因此,在调用 snapshot.appendItems(data)
之前,您需要确保数组不包含任何重复项。
您可以通过将
data
数组转换为 Set 并返回数组(如果顺序不是您的优先事项),或者通过遍历数组并手动删除所有重复项来完成此操作。