Применение NSDiffableDataSourceSnapshot к UICollectionViewDiffableDataSource вызывает исключение NSInternalInconsistencyException

Я пытаюсь реализовать UICollectionViewDiffableDataSource для моего collectionView. Мой код компилируется нормально, однако я продолжаю сталкиваться с этой ошибкой при первом применении к нему моментального снимка со следующей ошибкой:

Завершение работы приложения из-за неперехваченного исключения "NSInternalInconsistencyException", причина: "Недопустимый параметр, не удовлетворяющий: self.supplementaryViewProvider || (self.supplementaryReuseIdentifierProvider && self.supplementaryViewConfigurationHandler)'

Вот мой код:

    var groups: [Group] = [Group]()
    var dataSource: UICollectionViewDiffableDataSource<Section, Group>!

    // MARK: - View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        self.searchBar.delegate = self
        self.groups = DummyData.groups

        setupDataSource()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        performSearch(searchQuery: nil)
    }


    // MARK: - Helper Functions
    func performSearch(searchQuery: String?) {
        let filteredGroups: [Group]
        if let searchQuery = searchQuery, !searchQuery.isEmpty {
            filteredGroups = groups.filter { $0.contains(query: searchQuery) }
        } else {
            filteredGroups = groups
        }

        var snapshot = NSDiffableDataSourceSnapshot<Section, Group>()
        snapshot.appendSections([.main])
        snapshot.appendItems(filteredGroups, toSection: .main)
        dataSource.apply(snapshot, animatingDifferences: true, completion: nil)
    }

    func setupDataSource() {
        dataSource = UICollectionViewDiffableDataSource <Section, Group>(collectionView: collectionView) { (collectionView: UICollectionView, indexPath: IndexPath, group: Group) -> UICollectionViewCell? in

            guard let cell = self.collectionView.dequeueReusableCell(
                withReuseIdentifier: String(describing: MyGroupsCollectionViewCell.self), for: indexPath) as? MyGroupsCollectionViewCell else {
                    fatalError("Cannot create new cell") }

            cell.configure(withGroup: group)

            return cell
        }
    }

При необходимости могу выложить полный стек вызовов.

1 ответ

Решение

Нашел ответ. Я использовал раскадровку, чтобы создать свой collectionView, и случайно для атрибута заголовка раздела было установлено значение true. Из-за этого collectionView нужно было вытащить представление для заголовка раздела где-то, но я никогда не говорил ему, где, поэтому

параметр неудовлетворителен: self.supplementaryViewProvider || (self.supplementaryReuseIdentifierProvider && self.supplementaryViewConfigurationHandler)

Вот хорошая статья, которую я нашел об этом, для тех, кто в будущем столкнется с этой проблемой:https://medium.com/@jamesrochabrun/uicollectionviewdiffabledatasource-and-decodable-step-by-step-6b727dd2485

Другие вопросы по тегам