Мне нужно выполнить некоторую операцию всякий раз, когда UICollectionView был загружен полностью, т.е. в это время должны быть вызваны все методы источника данных / макета UICollectionView. Откуда я это знаю ?? Есть ли какой-либо метод делегата, чтобы узнать загруженный статус UICollectionView?
uicollectionview
delegates
reload
Джируне
источник
источник
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
к-viewWillDisappear:animated:
а.Это сработало для меня:
Синтаксис Swift 4:
источник
reloadData
обновляет объект,collectionView
поэтому он снова использует методы источника данных ... кperformBatchUpdates
нему прикреплен блок завершения, поэтому, если оба выполняются в основном потоке, вы знаете, что любой код, который был вставлен вместо него,/// collection-view finished reload
будет выполняться с новым и выложеннымcollectionView
На самом деле все очень просто.
Когда вы, например, вызываете метод reloadData UICollectionView или метод invalidateLayout его макета, вы делаете следующее:
Почему это работает:
В основном потоке (в котором мы должны выполнять все обновления пользовательского интерфейса) находится основная очередь, которая является последовательной по своей природе, то есть работает в режиме FIFO. Итак, в приведенном выше примере вызывается первый блок, в котором есть
reloadData
вызывается метод, за которым следует все остальное во втором блоке.Теперь основной поток также блокируется. Так что, если для выполнения вам
reloadData
требуется 3 секунды, обработка второго блока будет отложена на эти 3 секунды.источник
reloadData
теперь ставит в очередь загрузку ячеек в основном потоке (даже если вызывается из основного потока). Таким образом, ячейки фактически не загружаются (cellForRowAtIndexPath:
не вызываются) послеreloadData
возврата. Код-оболочка, который вы хотите выполнить после загрузки ваших ячеек,dispatch_async(dispatch_get_main...
и вызов этого кода после вашего вызоваreloadData
приведет к достижению желаемого результата.Просто чтобы добавить к отличному ответу @dezinezync:
Swift 3+
источник
Делай это так:
источник
Попробуйте принудительно выполнить синхронный проход макета через layoutIfNeeded () сразу после вызова reloadData (). Кажется, работает как для UICollectionView, так и для UITableView на iOS 12.
источник
Как ответил dezinezync , вам нужно отправить в основную очередь блок кода после
reloadData
изUITableView
илиUICollectionView
, а затем этот блок будет выполнен после того, как клетки извлечение изЧтобы сделать это более прямым при использовании, я бы использовал такое расширение:
Это также может быть реализовано
UITableView
висточник
Другой подход с использованием RxSwift / RxCocoa:
источник
performBatchUpdates
не работал в моем случае, это работает. Ура!Это работает для меня:
источник
Мне нужно было выполнить какое-то действие со всеми видимыми ячейками, когда представление коллекции загружается до того, как оно станет видимым для пользователя, я использовал:
Обратите внимание, что это будет вызываться при прокрутке представления коллекции, поэтому, чтобы избежать этих накладных расходов, я добавил:
и в самом действии:
Действие по-прежнему будет выполняться несколько раз, как количество видимых ячеек в исходном состоянии. но во всех этих вызовах у вас будет одинаковое количество видимых ячеек (все они). И логический флаг предотвратит его повторный запуск после того, как пользователь начал взаимодействовать с представлением коллекции.
источник
Я просто сделал следующее, чтобы выполнить что-либо после перезагрузки представления коллекции. Вы можете использовать этот код даже в ответе API.
источник
Лучшее решение, которое я нашел до сих пор, - использовать
CATransaction
для обработки завершения.Swift 5 :
источник
Def сделать это:
Затем звоните так внутри своего ВК
Убедитесь, что вы используете подкласс !!
источник
Эта работа для меня:
источник
Просто перезагрузите collectionView внутри пакетных обновлений, а затем проверьте в блоке завершения, завершен он или нет, с помощью логического «finish».
источник
Ниже приведен единственный подход, который у меня сработал.
источник
Вот как я решил проблему со Swift 3.0:
источник
Попробуй это:
источник
Вы можете сделать вот так ...
источник