В моем пользовательском UICollectionViewController
я вызываю метод UICollectionView
метод selectItemAtIndexPath:animated:scrollPosition:()
в ответ на нажатие пользователем кнопок навигации в пользовательском интерфейсе. Это всегда хорошо работает, когда выбранная ячейка все еще находится в поле зрения, но она не работает большую часть времени , когда UICollectionView
необходимо прокрутить, чтобы отобразить выбранную ячейку.
«Не работает» означает: представление коллекции правильно прокручивается до нужной позиции и отображает ячейку, но оно не устанавливает для свойства selected
объекта UICollectionViewCell
значение YES
.
«Не работает большую часть времени» означает: обычно он работает нормально, когда метод вызывается в первые 1-2 раза после запуска приложения, но затем он начинает давать сбой.
Пара двойных проверок показывает это:
- Ранее выбранная ячейка теперь отменена (ее свойство
selected
равно NO
)
- Вызов метода
UICollectionView
indexPathsForSelectedItems
возвращает массив с единственным объектом NSIndexPath
, который ссылается на правильную ячейку.
Моя IDE - Xcode 10.1. У меня эта проблема на реальном устройстве (iPhone 6 Plus), работающем под управлением iOS 12.1.2. У меня также проблема, когда я запускаю приложение в симуляторе под iOS 12.1, 11.4 и 10.3.1. Мои тесты ограничены устройствами iPhone x Plus и iPhone XS Max, потому что мое приложение использует только UICollectionView
на этих устройствах. Но теперь становится интересно: Проблема исчезает, когда я запускаю приложение в симуляторе под iOS 9.3 и iOS 8.4.
Мой главный вопрос: что-то изменилось между iOS 9 и iOS 10, что влияет на работу selectItemAtIndexPath:animated:scrollPosition:()
? Что-то, что мне нужно сделать дополнительно, чтобы заставить его работать должным образом?
Мой дополнительный вопрос: могу ли я что-то сделать, чтобы свойство selected
было установлено в YES
? Я пытался установить свойство напрямую, но это не имеет никакого эффекта. Я также пытался вызвать selectItemAtIndexPath:animated:scrollPosition:()
во второй раз или вызвать deselectItemAtIndexPath:()
с последующим selectItemAtIndexPath:animated:scrollPosition:()
, но, похоже, ничего не работает.
Если вы хотите увидеть код: это метод в моем пользовательском контроллере, который выполняет прокрутку / выбор. Метод вызывается с объектом NSIndexPath
, который ссылается на ячейку, которую нужно выбрать.
- (void) selectItemAtIndexPath:(NSIndexPath*)indexPath
{
UICollectionViewScrollPosition scrollPosition;
UICollectionViewFlowLayout* flowLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
if (flowLayout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
scrollPosition = UICollectionViewScrollPositionCenteredHorizontally;
else
scrollPosition = UICollectionViewScrollPositionCenteredVertically;
[self.collectionView selectItemAtIndexPath:indexPath
animated:NO
scrollPosition:scrollPosition];
}