Как сохранить действие 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 будет обрабатывать всю логику появления подсветки в одном месте.

Другие вопросы по тегам