我有一个具有自定义单元格的集合视图,只要单元格在屏幕上可见,它们就会不断重新加载。集合视图已向下滚动,然后向上滚动,以便再次显示单元格。我希望关闭它并希望单元格只加载一次,而不是每次都可见时刷新。这是我初始化单元格的代码。
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath: (NSIndexPath *)indexPath{
NSLog(@"cell row %d is being refreshed", indexPath.row);
static NSString *CellIdentifier = @"Cell";
LevelCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
Level *levelTemp =[levels objectAtIndex:indexPath.item];
[[cell levelNumber]setText:[NSString stringWithFormat:@"Level %@",levelTemp.level]];
DataClass *obj=[DataClass getInstance];
obj.totalC=obj.totalC+([levelTemp.comp_questions intValue]);
obj.totalQ=obj.totalQ+([levelTemp.max_questions intValue]);
int unlockA = [levelTemp.unlockAmount intValue];
return cell;
}
答案 0 :(得分:0)
这是一个坏主意。处理此问题的正确方法是让levels
存储所有需要的数据,从集合视图中获取下一个单元格,并使用levels
中的数据填充它。它具有内存效率和时间效率。
拥有NSMutableArray
来保留LevelCell
。由于不知道请求单元的顺序,因此需要预先初始化该数组。它必须与levels
的大小相同,并且值需要为[NSNull null]
。
self.cells = [NSMutableArray arrayWithCapacity:[levels count]];
for (NSUInteger i = 0; i < [levels count]; ++i) {
self.cells[i] = (id)[NSNull null];
}
这可以在您的-viewDidLoad
中,也可以作为延迟加载的属性。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Look to see if there is a cell at this index
LevelCell *cell = self.cells[indexPath.item];
if (cell == (id)[NSNull null]) {
NSLog(@"cell row %d is being refreshed", indexPath.item);
static NSString *CellIdentifier = @"Cell";
cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
Level *levelTemp =[levels objectAtIndex:indexPath.item];
[[cell levelNumber]setText:[NSString stringWithFormat:@"Level %@",levelTemp.level]];
DataClass *obj=[DataClass getInstance];
obj.totalC=obj.totalC+([levelTemp.comp_questions intValue]);
obj.totalQ=obj.totalQ+([levelTemp.max_questions intValue]);
int unlockA = [levelTemp.unlockAmount intValue];
// save the new cell in the array.
self.cells[indexPath.item] = cell;
}
return cell;
}
最后注意事项:更新数据时不会更新self.cells
。您需要手动执行此操作。更改,插入和删除都需要在levels
和self.cells
之间进行镜像。
同样,这是一个坏主意。真的,不要这样做。