UICollectionViewCell.selected иногда не установлено в YES - PullRequest
0 голосов
/ 09 января 2019

В моем пользовательском 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...