我将 AQGridView 用于图像网格。我需要在正在下载的特定图像上覆盖一个进度条。问题是,如果我将该图像单元格滚动到视野之外,进度条也会出现在另一个单元格上。我认为这是因为 cell 正在被重复使用。
有没有办法可以标记某些单元格不被重复使用?
我将 AQGridView 用于图像网格。我需要在正在下载的特定图像上覆盖一个进度条。问题是,如果我将该图像单元格滚动到视野之外,进度条也会出现在另一个单元格上。我认为这是因为 cell 正在被重复使用。
有没有办法可以标记某些单元格不被重复使用?
请不要那样做。您应该在 中更新您的单元格- 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;
}
UITableViewCells 默认会被 tableview 重用,以减少内存使用并提高效率,因此您不应该尝试禁用重用行为(尽管这是可能的)。您应该明确检查单元格是否包含加载图像,并根据需要显示/隐藏进度条(和进度),而不是禁用单元格被重用,可能通过标志。
如果您仍然需要禁用重用行为,请不要调用 dequeueTableCellWithIdentifier,而是创建 tableviewcells 的新实例并在 cellForRowAtIndexPath 中显式保留对它的引用。但是,这不能很好地扩展并且最终会消耗更多的内存,特别是如果您的 tableview 有很多条目。
这就是我的做法。在我的派生单元类中,我有一个实例变量
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] );
}