Это происходит потому, что ячейки повторно используется при прокрутке. Вы должны сохранить «выделенный» статус для всех строк в вашей модели (например, в массиве или NSMutableIndexSet
), а в collectionView:cellForItemAtIndexPath:
установить цвет фона ячейки в соответствии со статусом для этой строки.
В didSelectItemAtIndexPath
должно быть достаточно установить цвет только что выбранного и ранее выбранной ячейки.
Update: Если только одна ячейка может быть выбрана в то время, вы просто должны помнить индексный путь к выбранной ячейке.
Объявите свойство selectedIndexPath
по выделенному ряду:
@property (strong, nonatomic) NSIndexPath *selectedIndexPath;
В didSelectItemAtIndexPath
, снятия выделения предыдущей ячейки и выделить новую ячейку:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
if (self.selectedIndexPath != nil) {
// deselect previously selected cell
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:self.selectedIndexPath];
if (cell != nil) {
// set default color for cell
}
}
// Select newly selected cell:
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
if (cell != nil) {
// set highlight color for cell
}
// Remember selection:
self.selectedIndexPath = indexPath;
}
В cellForItemAtIndexPath
, используйте правильный цвет фона :
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Identifier" forIndexPath:indexPath];
if ([self.selectedIndexPath isEqual:indexPath) {
// set highlight color
} else {
// set default color
}
}
Я понимаю, что это происходит из-за многоразовых ячеек, но я как бы потерял вас после. Как сохранить выделенный статус? В didSelectItemAtIndexPath? Кроме того, что вы имеете в виду в своем последнем предложении? – Spenciefy
@Spenciefy: Каждый раз, когда вызывается 'collectionView: cellForItemAtIndexPath:', вы должны установить правильный цвет фона для ячейки. Поэтому вам нужно «запомнить» статус для * всех строк *. Это то, что я имел в виду, сохраняя статус в массиве или наборе индексов. –
Я вижу. Итак, как мне назначить выбранный или невыбранный в индексном наборе? – Spenciefy