Получение исключения NSInternalInconsistencyException, причина: "Недопустимый раздел 0." при поиске по нескольким разделам

Я получаю исключение при выполнении поиска в нескольких разделах. Это происходит при применении снимка к источнику данных.

Предыстория: у меня есть (предопределенные) разделы, и в каждом разделе есть набор элементов. Разделы не будут отображаться в viewController, если в разделе нет элементов. Элементы добавляются функцией приложения. После добавления элемента в один из разделов вызывается обновление источника данных, и отображается раздел с добавленным элементом.

Проблема: эта проблема возникает при двойной попытке поиска несуществующего элемента. Для воспроизведения вы можете ввести несуществующий элемент, затем удалить строку поиска с помощью возврата, затем снова ввести несуществующий элемент, тогда в dataSource.apply() будет выдана ошибка.

Надеюсь, что кто-то может помочь. TIA!

Вот код:

    func updateData(on searchItem: String = "") {
        //create a snapshot that will be used by the datasource to apply the diff changes
        snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        
        Manager.shared.getAllSections().forEach { section in
            
            let items = section.items
            
            //if search string is empty, we just assign the items of the section, 
            //else we filter it based on the searchItem
            var filteredItems = searchItem.isEmpty ? items :
                items.filter { $0.itemName.lowercased().contains(searchItem.lowercased()) }
            
            //if theres no items filtered, we ain't appending any section and items
            if filteredItems.count > 0 {
                snapshot.appendSections([section])
                snapshot.appendItems(filteredItems)
            }
        }
        
        //when calling apply, i get the exception when calling apply on dataSource
        dataSource.apply(snapshot, animatingDifferences: false)
    }

    //Here is the updateSearchResults delegate method triggered when typing something in the search bar
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchedItem = searchController.searchBar.text, !searchedItem.isEmpty else {
            updateData()
            return
        }
        
        updateData(on: searchedItem)
    }

2 ответа

Хорошо, поэтому я думаю, что это какая-то внутренняя ошибка в источнике данных, который не нравится, когда у вас 0 разделов в вашем представлении коллекции, но обходной путь, который я придумал, заключался в том, чтобы просто добавить фиктивный раздел и скрыть заголовок раздела (если у тебя есть).

в вашем методе updateData() вы можете добавить:

if snapshot.numberOfItems == 0 {
    snapshot.appendSections([YourSection(name: "dummy")])
}

Затем, если вы используете заголовок раздела, дайте этому фиктивному разделу некоторую идентифицируемую переменную, которую вы можете использовать, чтобы скрыть заголовок. При выводе из очереди дополнительного представления (заголовка) проверьте, есть ли имя == "dummy", а затем скройте заголовок, если это так.

Это взлом, но в конечном итоге он выглядит точно так же, и вам не нужно иметь дело с отображаемыми уродливыми пустыми разделами.

Насколько я понимаю, это происходит, когда композиционный макет пытается разрешить макет для раздела, которого нет в источнике данных.

В моем случае я использовал который возвращал старые разделы, когда мой источник данных возвращал правильные, но разные.

Как я исправил это, аннулировал макет: collectionView.collectionViewLayout.invalidateLayout()

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