0

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

有没有办法可以标记某些单元格不被重复使用?

4

3 回答 3

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;
}
于 2011-04-29T07:33:55.610 回答
0

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

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

于 2011-03-24T07:33:26.160 回答
-1

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

BOOL dontReuse;

我为 AQGridView 创建了一个类别并定义了 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] );
}
于 2011-03-25T09:33:49.387 回答