我正在使用AQGridView作为图像网格。我需要在正在下载的特定图像上覆盖进度条。问题是,如果我将图像单元格滚动到视图之外,进度条也会出现在另一个单元格上。我认为这是因为细胞正在重复使用。
有没有办法让某些细胞被重复使用?
答案 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] );
}