Получение сбоя утверждения при удалении последнего элемента из UICollectionView

Я удаляю элементы в UICollectionView с помощью следующего кода:

func DeleteItem(indexPath: NSIndexPath) { 

    // remove from the data source
    myList.removeObjectAtIndex(indexPath.item)

    // remove the item from the collection view
    self.collectionView!.performBatchUpdates({
        self.collectionView?.deleteItemsAtIndexPaths([indexPath])
    }, completion: nil)
}     

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

'NSInternalInconsistencyException', reason: 'attempt to delete item 4 from section 0 which only contains 4 items before the update'

Я отладил его, и кажется, что код удаления проверяет количество элементов в источнике данных, вызывая:

collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int)

когда вы пытаетесь удалить последний элемент, поскольку вы удалили один из источника данных, количество элементов в источнике данных становится равным индексу, который вы пытаетесь удалить в коллекции пользовательского интерфейса. В этом примере утверждения я пытаюсь удалить последний элемент с индексом 4 из источника данных, в котором изначально было 5 элементов, когда я удаляю элемент из источника данных, количество элементов становится 4, что равно индексу элемента, который нужно удалить из пользовательского интерфейса, поэтому код удаления вызывает утверждение.
Я не знаю, как это обойти. Правильный способ - сначала удалить элемент из источника данных, а затем из коллекции. В противном случае вы получите другие утверждения. Итак, как правильно это сделать? Спасибо!


person user2732722    schedule 13.12.2015    source источник


Ответы (3)


Я решил свою проблему. Дело было не в том, как я удалял элемент. Вышеупомянутый механизм правильный. Где-то в другом месте кода я вызывал reloadItemsAtIndexPaths после удаления. Я до сих пор не знаю, почему это может вызвать такое утверждение, но удаление reloadItemsAtIndexPaths решило проблему без ущерба для моей программы. Похоже, мне это вообще не нужно.

person user2732722    schedule 13.12.2015

Я столкнулся с той же проблемой и нашел решение:

В вашем коде, который обрабатывает удаление, вам нужно проверить, удаляете ли вы последний элемент в разделе. Если вы удаляете последний элемент, вам также необходимо перезагрузить раздел. Что-то вроде этого:

__weak typeof(self)weakSelf = self;
[items removeObjectAtIndex:index];
[self.collectionView performBatchUpdates:^{
    [weakSelf.collectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:sectionIndex]]];
    if (items.count == 0) {
       [weakSelf.collectionView reloadSections:[NSIndexSet indexSetWithIndex:sectionIndex]];
    }
} completion:nil];
person TylerJames    schedule 03.10.2016

Попробуйте удалить элемент из списка внутри блока обновлений.

person Sande Harsa    schedule 13.12.2015
comment
Я сделал, и я получил утверждение, которое я разместил для вас. - person user2732722; 13.12.2015