Как сохранить действие didSelect в UICollectionView в Objective-c?
У меня есть UICollectionView, и я добавляю из своей ячейки cellForItemAtIndexPath 12 ячеек. Когда я делаю прокрутку, чтобы увидеть ячейки вниз, все функции сохраняются, но когда я делаю прокрутку, чтобы снова подняться, некоторые ячейки не выполняют функцию, загруженную в didSelectItemAtIndexPath.
Я отключил некоторые строки. Но не строка, на которую я нажал. Почему это может быть? Может ли быть плохая подготовка к повторному использованию клетки?
Я пытаюсь использовать функцию повторного использования, но это только влияет на отрисовку ячейки неправильно или на другую позицию, и функция, добавленная в didSelectItemAtIndexPath, не работает:
[self.myCollectionView reloadData];
[self.myCollectionView layoutIfNeeded];
NSArray *visibleItems = [self.myCollectionView indexPathsForVisibleItems];
NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
NSIndexPath *nextItem = [NSIndexPath indexPathForItem:currentItem.item + 1 inSection:currentItem.section];
[self.myCollectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
Когда я делаю прокрутку и кликаю по одной ячейке, это не открывает мой secondViewController, я думаю, что эта ячейка получает неправильный индекс, который был отключен.
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyViewController *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCell" forIndexPath:indexPath];
switch ([indexPath row]) {
case 0:
titleCell= @"Title0";
detailCell=@"Detail0";
if([indexPath row]==2){
[cell setUserInteractionEnabled:NO];//Here I set disable Could be the problem caused by this??
}
[cell.image setHidden:YES];
cell.image.contentMode = UIViewContentModeScaleAspectFit;
break;
//Here other cases with the same structure
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView deselectItemAtIndexPath:indexPath animated:NO];
MySecondClass *secondClass = [self.storyboard instantiateViewControllerWithIdentifier:@"myVC"];
[self.navigationController pushViewController:secondClass animated:YES];
}
-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
//Here assign yellow background color to first row and white color to the second row
}
И в своем классе я добавила prepareForReuse, но это не работает...
- (void)prepareForReuse {
[super prepareForReuse];
[self removeFromSuperview];
[self setNeedsLayout];
}
2 ответа
Проблема заключается в следующем фрагменте кода:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyViewController *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCell" forIndexPath:indexPath];
switch ([indexPath row]) {
case 0:
titleCell= @"Title0";
detailCell=@"Detail0";
if([indexPath row]==2){
[cell setUserInteractionEnabled:NO];//Here I set disable Could be the problem caused by this??
}
[cell.image setHidden:YES];
cell.image.contentMode = UIViewContentModeScaleAspectFit;
break;
return cell;
}
Потому что клетки многоразовые. Таким образом, ячейка, которую вы отключили ранее (например, cell0), будет по-прежнему использоваться повторно. При прокрутке, например, cell0 станет cell11. Однако его настройка все еще отключена.
Вам нужно добавить оператор else, чтобы удалить отключенную настройку, подобную этой.
if([indexPath row]==2){
[cell setUserInteractionEnabled:NO];//Here I set disable Could be the problem caused by this??
}
else{
[cell setUserInteractionEnabled:YES];
}
Когда ячейка прокручивается за пределы экрана, она потенциально освобождается или (что более вероятно) перерабатывается, поэтому любое состояние, которое у вас есть в этой ячейке, не сохраняется после ее выключения. Решение состоит в том, что вы должны проверить, выбрана ли ячейка, и обновить ее внешний вид в cellForRowAtIndexPath. Вы можете просто сделать так, чтобы через didSelectItemAtIndexPath и didDeselectItemAtIndexPath вызывался reloadRowsAtIndexPath, а cellForRowAtIndexPath будет обрабатывать всю логику появления подсветки в одном месте.