卸载UICollectionview并重新加载?

时间:2013-06-20 11:42:37

标签: ios uicollectionview reloaddata collectionview

尝试在iOS中重新加载UICollectionview时,我有一个探测器。

我用它来显示游戏中的等级。

集合视图由10个单元组成。单元格的内容取决于某个级别是否已解锁。如果级别未锁定,则单元格显示级别(自定义UIView),否则显示图像。 我必须创建单独的单元格标识符才能使用,并且所有内容都在加载时完美显示。

我的问题是当用户正在玩解锁级别然后解锁下一级别时。当用户从游戏视图导航回到关卡选择视图时,单元格不会正确重新加载(只显示自定义视图所在的位置,图像显示正确)。

我试图在viewWillAppear中使用级别卸载数组,然后调用[collectionview reloadData] ;,然后再次加载级别并重新加载collectionview,但这没有帮助。

如何清空整个集合视图并在显示视图时重新创建单元格标识符?

由于

- 编辑!更新代码 -

-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];

levelsArray = nil;
puzzlesArray = nil;

levelsArray = [[NSMutableArray alloc]init];
puzzlesArray = [[NSMutableArray alloc]init];

[collectionView reloadData];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"puzzles"];
puzzlesArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if ([puzzlesArray count] == 0) {
    [self.navigationController popViewControllerAnimated:YES];
}
else {
    NSLog(@"%i puzzles loaded", [puzzlesArray count]);

    //Get alle puzzles for the current category
    for (Puzzle *puzzle in puzzlesArray) {

        if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"Category"] isEqualToString:[puzzle categoryName]]) {
            [levelsArray addObject:puzzle];
        }

    }

}

NSLog(@"View will appear");
[collectionView reloadData];

}

在索引路径的项目单元格中

    - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; {

    BOOL isUnlocked = [self isPuzzleUnlocked:[indexPath row]];

    if ([[NSUserDefaults standardUserDefaults]boolForKey:@"u"] == YES) {
        isUnlocked = YES;
    }

    [self.collectionView registerNib:[UINib nibWithNibName:@"CVCell" bundle:nil] forCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d", kCellReuseIdentifier, indexPath.row]];

    CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d", kCellReuseIdentifier, indexPath.row] forIndexPath:indexPath];

[cell setPuzzleInfo:[levelsArray objectAtIndex:[indexPath row]] unlocked:isUnlocked];

        return cell;

}

2 个答案:

答案 0 :(得分:1)

符合Rob的建议。

-(void)viewWillAppear {
   [super viewWillAppear];
   [self.collectionView reloadData]; 
}

cellForItemAtIndexPath中,您只需检查项目是否已解锁,并显示正确的图像或自定义单元格。

这就是全部。重新创建集合视图肯定是

您可能希望通过让游戏控制器和关卡控制器访问建模级别的数据来尊重MVC(模型 - 视图 - 控制器)设计模式。当游戏中发生的事情解锁一个新的水平时,它应该改变这些数据。集合视图应该在它出现之前根据这些数据重新加载。

编辑:

如果您获得与以前相同的单元格/项目reloadData,则表示您的配置设置不正确。关键是明确设置unlocked - reloadData如果项目已更改,则会更新项目。

EDIT2:

你的itemForRowAtIndexPath方法都搞砸了。对registerNib的调用根本不属于那里!它应该在初始化过程中被调用。如果您使用故事板,则根本没有必要。

这是一个你应该使用的简单框架:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv 
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath; {

   PuzzleInfo *puzzleObject = [dataArray objectAtIndex:indexPath.row]; 
   // you can use your more complicated data structure here, but 
   // have one object, dictionary, array item, etc. that has the info you need

   NSString *identifier = puzzleObject.unlocked ? kUnlockedCell : kLockedCell;
   CVCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier
           forIndexPath:indexPath];

   if (puzzleObject.unlocked) {
      // configure the unlocked cell 
   }
   else {
      // configure the locked cell
   }

   return cell;
}

答案 1 :(得分:-3)

我修好了!

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; {
NSLog(@"CALLED");
BOOL isUnlocked = [self isPuzzleUnlocked:[indexPath row]];

if ([[NSUserDefaults standardUserDefaults]boolForKey:@"u"] == YES) {
    isUnlocked = YES;
}
int rand = arc4random() % 99001;
[self.collectionView registerNib:[UINib nibWithNibName:@"CVCell" bundle:nil] forCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d%i", kCellReuseIdentifier, indexPath.row, rand]];

CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d%i", kCellReuseIdentifier, indexPath.row, rand] forIndexPath:indexPath];
[cell setPuzzleInfo:[levelsArray objectAtIndex:[indexPath row]] unlocked:isUnlocked];

    return cell;

}

不是一个非常有效的解决方案(或优雅),但它有效。向每个单元格添加随机数会强制每次重新创建它。只要我在集合视图中只有10个单元格,我认为它会没问题。

感谢你的帮助:]