尝试在 iOS 中重新加载 UICollectionview 时遇到问题。
我用它来显示游戏中的关卡。
集合视图由 10 个单元格组成。单元格的内容取决于关卡是否解锁。如果关卡解锁,单元格会显示关卡(自定义 UIView),否则会显示图像。我必须创建单独的单元格标识符才能使其正常工作,并且一切都在加载时完美显示。
我的问题是当用户正在玩解锁级别然后解锁下一个级别时。当用户从游戏视图导航回到关卡选择视图时,单元格没有正确重新加载(只是在自定义视图应该是空的地方显示,图像正确显示)。
我试图在 viewWillAppear 中卸载带有级别的数组,然后调用 [collectionview reloadData];,然后加载级别并再次重新加载 collectionview,但这无济于事。
如何在显示视图时清空整个 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;
}