防止在AQGridView中重用单元格

时间:2011-03-24 07:19:59

标签: ipad aqgridview reuseidentifier

我正在使用AQGridView作为图像网格。我需要在正在下载的特定图像上覆盖进度条。问题是,如果我将图像单元格滚动到视图之外,进度条也会出现在另一个单元格上。我认为这是因为细胞正在重复使用。

有没有办法让某些细胞被重复使用?

3 个答案:

答案 0 :(得分:2)

请不要那样做。您应该在- gridView:cellForItemAtIndex:中更新您的单元格,该单元格会在每个可见的单元格中被调用。

类似的东西:

- (AQGridViewCell *)gridView:(AQGridView *)aGridView cellForItemAtIndex:(NSUInteger)index
{
     AQGridViewCell *cell;

     // dequeue cell or create if nil
     // ...

     MyItem *item = [items objectAtIndex:index];
     cell.progressView.hidden = !item.downloading;

     return cell;
}

答案 1 :(得分:0)

默认情况下,tableview将重用UITableViewCells以减少内存使用并提高效率,因此您不应尝试禁用重用行为(尽管可能)。您应该明确检查单元格是否包含加载图像,并根据需要显示/隐藏进度条(和进度),而不是禁用该单元格。

如果仍需要禁用重用行为,请不要调用dequeueTableCellWithIdentifier,而是创建tableviewcells的新实例,并在cellForRowAtIndexPath中显式保留对它的引用。但是这不能很好地扩展,最终会消耗更多的内存,特别是如果你的tableview有很多条目。

答案 2 :(得分:-1)

我是这样做的。在我的派生单元格类中,我有一个实例变量

BOOL dontReuse;

我为AQGridView创建了一个Category,并定义了dequeueReusableCellWithIdentifier,如下所示:

    - (AQGridViewCell *) dequeueReusableCellWithIdentifier: (NSString *) reuseIdentifier AtIndex:(NSUInteger) index
{
    /* Be selfish and give back the same cell only for the specified index*/
    NSPredicate* predTrue = [NSPredicate predicateWithFormat:@"dontReuse == YES"];
    NSMutableSet * cells = [[[_reusableGridCells objectForKey: reuseIdentifier] filteredSetUsingPredicate:predTrue] mutableCopy];
    for(AQGridViewCell* cell in cells){
        if(index == [cell displayIndex]) {
            [[_reusableGridCells objectForKey: reuseIdentifier] removeObject: cell];
            return cell;
        }
    }

    NSPredicate* predFalse = [NSPredicate predicateWithFormat:@"dontReuse == NO"];
    cells = [[[_reusableGridCells objectForKey: reuseIdentifier] filteredSetUsingPredicate:predFalse] mutableCopy];

    AQGridViewCell * cell = [[cells anyObject] retain];
    if ( cell == nil )
        return ( nil );

    [cell prepareForReuse];

    [[_reusableGridCells objectForKey: reuseIdentifier] removeObject: cell];
    return ( [cell autorelease] );
}