UICollectionView单元格在可见时会不断重新加载

时间:2014-03-05 00:40:49

标签: ios objective-c uicollectionview

我有一个具有自定义单元格的集合视图,只要单元格在屏幕上可见,它们就会不断重新加载。集合视图已向下滚动,然后向上滚动,以便再次显示单元格。我希望关闭它并希望单元格只加载一次,而不是每次都可见时刷新。这是我初始化单元格的代码。

-(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;
}

1 个答案:

答案 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。您需要手动执行此操作。更改,插入和删除都需要在levelsself.cells之间进行镜像。

同样,这是一个坏主意。真的,不要这样做。