insertItems при сбое представления коллекции - PullRequest
0 голосов
/ 24 апреля 2018

Я создаю приложение, которое использует collectionView для отображения рецептов. Когда пользователь прокручивает до конца, я вызываю свой сервер и выбираю больше рецептов. В настоящее время я вызываю reloadData () после того, как сервер отвечает новыми рецептами. Это работает, но перезагружает все, когда все, что мне нужно сделать, это загрузить новые рецепты. Я читал похожие посты, указывающие, что я могу использовать insertItems - но для меня это вылетает с: libc ++ abi.dylib: завершается с необработанным исключением типа NSException

Вот мой код:

func updateRecipes(recipesToAdd: Array<Recipe>) {
    let minNewRecipesIndex = (self.recipes.count + 1)
    recipes += recipesToAdd
    DispatchQueue.main.async {
        if recipesToAdd.count == self.recipes.count {
                self.collectionView?.reloadData()
        } else {
            let numberOfItems: [Int] = Array(minNewRecipesIndex...self.recipes.count)
            self.collectionView?.insertItems(at: numberOfItems.map { IndexPath(item: $0, section: 0) })
            // this crashes, but self.collectionView.reloadData() works
        }
    }
}

Даже простой жесткий код - self.collectionView? .InsertItems (at: IndexPath (item: 1, section: 0)) - вылетает.

1 Ответ

0 голосов
/ 24 апреля 2018

Два выпуска:

  • minNewRecipesIndex должно быть self.recipes.count. Представьте себе пустой массив (.count == 0), индекс для вставки элемента в пустой массив равен 0, а не 1.

  • numberOfItems должно быть Array(minNewRecipesIndex...self.recipes.count - 1) или Array(minNewRecipesIndex..<self.recipes.count). Снова представьте пустой массив. Два элемента вставляются с индексами 0 и 1, minNewRecipesIndex - это 0, а self.recipes.count - это 2, поэтому необходимо уменьшить значение или использовать оператор полуоткрытия.

Если код все еще дает сбой, используйте цикл for, заключенный в beginUpdates() / endUpdates(), и вставьте элементы один за другим в последний индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...