3

在 中UICollectionView,我有一个 custom UICollectionViewCellClass,其中prepareForReuse被默认格式化人员覆盖。

我有一个NSMutableArray来自NSIndexPathsdidSelectItemAtIndexPath :的内容。

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想没有被称为。

我觉得它必须是非常简单的东西,但我现在看不到它。

我试图理解是否调用了NSLogsshouldSelectItemAtIndexPath方法并且根本没有调用该方法。当所选单元格和有问题的单元格之间有 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];



}
4

3 回答 3

2

我发现了两个问题。prepareForReuse 方法似乎搞砸了,所以我把它删除了。不过,主要问题是您实现 isSelectedIndexPath: 的方式。一旦在您遍历项目时找到第一个选定项目,它就会返回 YES 并退出循环。您想要做的只是检查 indexPath 是否包含在 selectedCellIndexPaths 数组中:

-(BOOL)isSelectedIndexPath:(NSIndexPath *)indexPath{

    if ([selectedCellIndexPaths containsObject:indexPath]) {
        return YES;
    }else{
        return NO;
    }
}

或者,如果您更喜欢使用更简洁的语法,可以将 if-else 块替换为:

return  ([selectedCellIndexPaths containsObject:indexPath])? YES : NO;
于 2013-04-06T20:25:44.760 回答
1

我最近在我的应用程序中遇到了完全相同的问题。UICollectionViewCell 选择在 iOS 8.3 之前正常工作,随后我开始看到一些奇怪的行为。实际未选择的单元格将显示为已选中,而其他单元格似乎随机无法选择。

我在 UICollectionViewCell 子类上实现了自定义setSelected和 方法,如下所示:prepareForResuse

 -(void)setSelected:(BOOL)selected
{
     [super setSelected:selected];

    if (selected)
    {
        [[self selectedIndicator] setHidden:NO];
    }
    else
    {
        [[self selectedIndicator] setHidden:YES];
    }
}

-(void)prepareForReuse
{
    [[self imageView] setImage:nil];
}

prepareForReuse方法只需重置自定义单元格中的图像视图。

在我的prepareForReuse方法中,我没有调用[super prepareForReuse](根据文档,默认情况下它什么都不做)。当我将调用添加到[super prepareForReuse]所有选择时,都按预期工作。尽管 Apple 声明默认实现什么都不做,但他们也建议应该调用 super。遵循此建议解决了我的问题。

于 2015-06-26T15:30:00.820 回答
0

在 iOS 10 中,我发现在启用预取时以编程方式清除启用了多选的 UICollectionView 是错误的。当然,预取在 iOS 10 中是默认开启的。

于 2016-11-17T04:26:42.243 回答