Подтвердить что ты не робот

Перезагрузка UICollectionView с использованием метода reloadData возвращается непосредственно перед перезагрузкой данных

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

Я пробовал код, например

[self.collectionView reloadData];
[self configure cells]; // BOOM! cells are nil

Я также пробовал использовать

[self.collectionView performBatchUpdates:^{
  [self.collectionView reloadData];
    } completion:^(BOOL finished) {
        // notify that completed and do the configuration now
  }];

но когда я перезагружаю данные, я получаю сбои.

Как я могу перезагрузить данные в коллекцию, и только после того, как она закончит перезагрузку, выполните специальный обработчик завершения

4b9b3361

Ответ 1

Это вызвано добавлением ячеек в layoutSubviews не в reloadData. Поскольку layoutSubviews выполняется во время следующего прогона цикла цикла после reloadData, ваши ячейки пусты. Попробуйте сделать это:

[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
[self configure cells]; 

У меня была аналогичная проблема и разрешил ее таким образом.

Ответ 2

Просмотр коллекции не поддерживается для перезагрузки с помощью reloadData. Все анимации должны выполняться с помощью таких методов, как

[collectionView deleteItemsAtIndexPaths:indexesToDelete];
[collectionView insertSections:sectionsToInsert];
[collectionView reloadItemsAtIndexPaths:fooPaths];

внутри блока performBatchUpdates:. Этот метод reloadData может использоваться только для грубого обновления, когда все элементы удаляются и выкладываются снова без анимации.

Ответ 3

Если вы хотите выполнить некоторый код после того, как ваш CollectionView завершил его метод reloadData(), попробуйте это (Swift):

    self.collectionView.reloadData()
    self.collectionView.layoutIfNeeded()
    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        // Put the code you want to execute when reloadData is complete in here
    }

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