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)


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

Решение

  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