Обновление UICollectionView на основе сравнения массивов - PullRequest
0 голосов
/ 14 января 2019

В настоящее время у меня есть collectionView: UICollectionView, который отображает содержимое на основе массива объектов с именем projects. Иногда я получаю обновленный массив с именем newProjects с сервера. newProjects должен заменить projects в качестве источника данных для collectionView.

Я нашел способ обновить collectionView, когда объекты были удалены из массива, с помощью следующего кода:

var indexPaths = [IndexPath]()

for project in projects {

    if(!newProjects.contains(project)) {

        let index = projects.firstIndex(of: project)
        indexPaths.append(IndexPath(item: index!, section: 0))
    }                      
}

collectionView.deleteItems(at: indexPaths)

projects = newProjects
collectionView.reloadData()

Это работает для удаленных проектов. Тем не менее, я также пытаюсь реагировать на добавленные проекты. Однако мой код не работает, так как я получаю исключение:

Неверное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (65), должно быть равно количеству элементов, содержащихся в этом разделе до обновления (64), плюс или минус количество элементов, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено) и плюс или минус количество элементов, перемещенных в или из этого раздела (0 перемещено, 0 перемещено).

Мой код для сравнения добавленных проектов:

// First, the deletion from the code above is called.
// project = newProjects and data reload doesn't happen after deletion.

var addIndexPaths = [IndexPath]()

for project in newProjects {

    if(!projects.contains(project)) {

        projects.append(content)
        addIndexPaths.append(IndexPath(item: projects.count - 1, section: 0))
    }
}

collectionView.insertItems(at: addIndexPaths)

projects = newProject 
collectionView.reloadData()

Я уверен, что этот код отчасти хакерский (поскольку он не работает), но я, честно говоря, не могу понять, как еще можно надежно обновить UICollectionView. У кого-нибудь есть предложения или полезные ссылки? Ура!

1 Ответ

0 голосов
/ 14 января 2019

Как указывало Вез , все операции по вставке и удалению данных работали. Теперь весь вызов просто уменьшен до:

projects = newProjects
collectionView.reloadData()

Сначала я подумал, что это не сработало, но это было связано с проблемой с сервером. Я еще не пробовал, думая, что мне нужно вручную вставить все измененные проекты.

Как указал rmaddy , извлечение reloadData() из исходного кода также сработало! Моя первоначальная мысль по какой-то причине заключалась в том, что reloadData() понадобится после добавления и удаления элементов, возможно потому, что я также подумал, что UITableViews требует от вас вызова endUpdates() ... Я слишком усложнил некоторые важные понятия.

Спасибо всем!

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