Я пытался создать представление коллекции со списком ячеек. И когда пользователь нажимает кнопку, он будет случайным образом выбирать одну из ячеек.Ios10 UICollectionView prefetching enabled вызывает selectItemAtIndexPath ведет себя некорректно
Теперь предположим, что всего 10 ячеек. i.e numberOfItemsInSection
Делегат возвращает 10. Контроллер представления является источником данных для коллекцииView. Вид коллекции называется myCollectionView
. И это имеет свойство selectedIndexPath
Так ViewController:
@interface ViewController() < UICollectionViewDataSource>
@property (nonatomic, strong) NSIndexPath * selectedIndexPath;
@property (strong, nonatomic) IBOutlet UICollectionView *myCollectionView;
@end
Вот мой случайный выбор кода в контроллере представления:
-(void)chooseRandom{
NSInteger randomShadeIndex = arc4random_uniform((uint32_t)10);
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:randomShadeIndex inSection:0];
self.selectedIndexPath = indexPath;
[self.myCollectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
}
А вот мой cellForItemAtIndexPath
на мой взгляд, контроллер
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
MyCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
cell.selected = self.selectedIndexPath == indexPath;
return cell;
}
И вот setSelected:
метод MyCell
:
- (void)setSelected:(BOOL)selected{
[super setSelected:selected];
if (selected){
self.backgroundColor = [UIColor redColor];
} else {
self.backgroundColor = [UIColor greenColor];
}
}
Так что теперь, когда я называю chooseRandom
от кнопки. Если случайная ячейка, которая будет выбрана, не видна (не в текущем экране), то есть высокая вероятность того, что она не будет иметь setSelected:YES
, который вызывается во время selectItemAtIndexPath:
. (Или он вызывается, но устанавливает ячейку. Вместо этого выбирается NO
от YES
). Значение результирующего экрана не отображает ни одну ячейку.
И интересно, когда я пробовал прикоснуться к экрану (без выбора какой-либо ячейки). Он будет вызывать setSelected:
на ячейку, которую нужно выбрать. Так что, думаю, selectItemAtIndexPath:
прослушивается.
И это происходит только тогда, когда prefetching enabled
в построителе интерфейса настроен на включение (по умолчанию для ios 10).
И я попытался следующие пути решения, но ни один из них не работает:
Добавить
[self.myCollectionView cellForItemAtIndexPath:indexPath].selected = YES;
в концеchooseRandom
.Использование
scrollToItemAtIndexPath
наряду с методом 1 вместоselectItemAtIndexPath:
Я думаю, либо это ошибка или я что-то полностью игнорировать. Я застрял на этом часами и не мог понять, почему. Теперь я думаю, что это скорее всего ошибка для selectItemAtIndexPath
с prefetching enabled
.
Пожалуйста, помогите мне и скажите, если вы столкнулись с той же проблемой. Благодаря!
EDIT: не уверен, что такой же вопрос. this link has similar issue but with deselect
Попробуйте позвонить scrollToItemAtIndexPath: а следующая строка вызова selectItemAtIndexPath: –
@jayarj Я попробовал это, и это не сработало. Также я думаю, что он должен был прокручиваться в selectItemAtIndexPath. – dknyxh
Когда включена предварительная выборка, метод collectionView (_: cellForItemAt :) в делегате представления коллекции вызывается заранее, когда ячейка требуется. Чтобы избежать несоответствий в визуальном внешнем виде, используйте метод делегата collectionView (_: willDisplay: forItemAt :) для обновления ячейки, чтобы отразить визуальное состояние, такое как выбор. – SPatel