Получение исключения 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()