В UICollectionView
у меня есть пользовательский UICollectionViewCellClass
, где prepareForReuse переопределяется для сотрудников по умолчанию.Повторное использование ячеек UICollectionView - некоторые ячейки не выбраны
У меня есть NSMutableArray
, содержащий NSIndexPaths
от didSelectItemAtIndexPath:.
В cellForItemAtIndexPath: Я переформатировал выделенные ячейки так, чтобы они были выбраны.
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
ButtonCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ButtonCell" forIndexPath:indexPath];
NSString *title = self.ingredientsBook.names[indexPath.item];
cell.label.text = title;
if ([self isSelectedIndexPath:indexPath]){
cell.backgroundColor = [UIColor whiteColor];
cell.label.textColor = [UIColor blueColor];
}
return cell;
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
self.searchButton.enabled = YES;
ButtonCell *cell = (ButtonCell *)[collectionView cellForItemAtIndexPath:indexPath];
[selectedCellIndexPaths addObject:indexPath];
NSLog(@"%@", selectedCellIndexPaths);
cell.backgroundColor = [UIColor whiteColor];
cell.label.textColor = [UIColor blueColor];
NSString *name = self.ingredientsBook.names[indexPath.item];
[self.selectedIngredientNames addObject:name];
}
Проблема в том, что при нажатии первой ячейки невозможно выбрать 16-й или 17-й. Или, если я коснусь первых трех, невозможно выбрать три последних. didSelectItemAtIndexPath
не называется.
Я чувствую, что это должно быть что-то очень простое, но я не вижу его прямо сейчас.
Я попытался поместить NSLogs
в shouldSelectItemAtIndexPath
, чтобы понять, был вызван этот метод и метод вообще не вызван. Это происходит, когда между выбранным и проблемным существует расстояние 16 ячеек.
Вот другие методы источника данных и isSelectedIndexPath:
-(BOOL)isSelectedIndexPath:(NSIndexPath *)indexPath{
for (NSIndexPath *test in selectedCellIndexPaths){
if (test == indexPath){
return YES;
}
}
return NO;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [self.ingredientsBook.names count];
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 1;
}
-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%@", indexPath);
return YES;
}
-(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{
self.searchButton.enabled = ([[collectionView indexPathsForSelectedItems] count] > 0);
ButtonCell *cell = (ButtonCell *)[collectionView cellForItemAtIndexPath:indexPath];
cell.backgroundColor = [UIColor blackColor];
cell.label.textColor = [UIColor whiteColor];
[selectedCellIndexPaths removeObject:indexPath];
NSString *name = self.ingredientsBook.names[indexPath.item];
[self.selectedIngredientNames removeObject:name];
}
Что такое isSelectedIndexPath? Где вы это создаете? Я думаю, вам также нужна часть «else», чтобы сказать, как выглядят ячейки, если [self isSelectedIndexPath: indexPath] возвращает false. – rdelmar
это метод, который проверяет, содержится ли indexPath в NSMutableArray из NSIndexPaths. он всегда возвращает false отдельно, когда indexPath равен одному из выбранных в массиве. – ragnarok
Хорошо, вы добавили часть «else» в оператор if, чтобы узнать, помогает ли это. Из-за повторного использования ячеек вам нужно установить внешний вид ячейки в невыбранное состояние, если это утверждение if false. – rdelmar