2

У меня есть горизонтальная коллекция с кодом для выделения/цвета выбранной ячейки. Он выделяет выбранную ячейку, но затем каждые 5 ячеек также выделяются. Любая идея, что происходит?UICollectionViewCell Selection выбирает/выделяет каждые 5 ячеек

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for(int x = 0; x < [cellArray count]; x++){ 
     UICollectionViewCell *UnSelectedCell = [cellArray objectAtIndex:x]; 
     UnSelectedCell.backgroundColor = [UIColor colorWithRed:0.2 green:0.5 blue:0.8 alpha:0.0]; 
    } 
    UICollectionViewCell *SelectedCell = [cellArray objectAtIndex:indexPath.row]; 
    SelectedCell.backgroundColor = [UIColor colorWithRed:0.2 green:0.5 blue:0.8 alpha:1.0]; 
    cellSelected = indexPath.row; 
    NSLog(@"%i", cellSelected); 

} 

ответ

6

Это происходит потому, что ячейки повторно используется при прокрутке. Вы должны сохранить «выделенный» статус для всех строк в вашей модели (например, в массиве или 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 
    } 
} 
+0

Я понимаю, что это происходит из-за многоразовых ячеек, но я как бы потерял вас после. Как сохранить выделенный статус? В didSelectItemAtIndexPath? Кроме того, что вы имеете в виду в своем последнем предложении? – Spenciefy

+0

@Spenciefy: Каждый раз, когда вызывается 'collectionView: cellForItemAtIndexPath:', вы должны установить правильный цвет фона для ячейки. Поэтому вам нужно «запомнить» статус для * всех строк *. Это то, что я имел в виду, сохраняя статус в массиве или наборе индексов. –

+0

Я вижу. Итак, как мне назначить выбранный или невыбранный в индексном наборе? – Spenciefy

0

Я думаю, вы используете многоразовую ячейку для сбора - есть пункт. Оболочка для установки цвета фона по умолчанию перед повторным использованием.

+0

Как бы установить t он по умолчанию перед ячейкой повторного использования; Я выделяю ячейку, когда она выбрана. – Spenciefy

Смежные вопросы