UICollectionView Tap выбирает более одной ячейки

У меня возникает странная проблема, когда я касаюсь одной ячейки UICell в UICollectionView, а затем прокручиваю вниз или вверх в UICollectionView. Я вижу, что выбрана еще одна ячейка. Другие выбранные ячейки, которые не были затронуты, кажутся выбранными случайным образом в макете UICollectionView. У меня есть 3 столбца ячеек и много строк в UICollectionView.

В моем коде у меня есть следующее:

- (void)collectionView:(UICollectionView *)myCV didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    LogInfo(@"Item Selected");
    // highlight the cell user tapped on
    UICollectionViewCell  *cell = [myCV cellForItemAtIndexPath:indexPath];
    [cell.layer setBorderWidth:10.0f];
    cell.layer.borderColor = [UIColor colorWithRed: 108/255. green: 166/255. blue: 16/255. alpha:1.0].CGColor;
    cell.layer.CornerRadius = 10;

}

Код выделения просто помещает границу в выбранную ячейку.

Есть ли способ убедиться, что выбрана только ячейка, на которую нажимают?


person motionpotion    schedule 19.01.2013    source источник


Ответы (1)


arrow_upward
2
arrow_downward

Потому что клетки можно использовать повторно, верно? вот почему вы получаете этот результат.

Решение

  1. Сохраните выбранный indexpath где-нибудь.

  2. Подкласс вашей ячейки от UICollectionViewCell, затем переопределите метод UICollectionViewCell prepareForReuse, там вам нужно сбросить все форматирование, которое вы сделали (в методе didSelectItemAtIndexPath), до их значений по умолчанию и сделать ячейку готовой к использованию снова. Подробнее о prepareForReuse см. здесь

  3. Снова примените то же форматирование в cellForRowItemAtIndexPath к выбранной ячейке, индексный путь которой вы сохранили первым. это оно!

И, наконец, я бы посоветовал не делать никаких операций с форматированием ячеек прямо здесь. Попытайтесь понять UICollectionViewLayoutAttributes и используйте его, чтобы делать подобные вещи.

person Jirune    schedule 22.01.2013
comment
Привет Джирунэ. Спасибо за ответ. Сохраните выбранный индексный путь где-нибудь. Не могли бы вы объяснить немного больше, где я должен сохранить его? - person motionpotion; 25.01.2013
comment
Хм. Просто объявите одну глобальную переменную NSIndexPath, затем назначьте выбранный индексный путь этой переменной, теперь на основе этого сохраненного индекса вы просто применяете форматирование в cellForItemAtIndexPath, вот и все. - person Jirune; 26.01.2013