我尝试在iOS中重新加载UICollectionView时有一个probem。卸载UICollectionView并重新加载?
我使用它来显示游戏中的关卡。
collectionview由10个单元组成。单元格的内容取决于级别是否解锁。如果关卡解锁,那么单元显示关卡(一个自定义的UIView),否则显示一个图像。 我不得不为此创建单独的单元格标识符,并且所有内容在加载时都完美显示。
我的问题是当一个用户正在玩一个解锁的关卡,然后解锁下一个关卡。当用户从游戏视图返回到级别选择视图时,单元格未正确重新加载(只在自定义视图应该显示的位置显示空白,图像正确显示)。
我试图用viewWillAppear中的级别卸载数组,然后调用[collectionview reloadData] ;,然后加载级别并重新加载collectionview,但这没有帮助。
如何在显示视图时清空整个collectionview并重新创建单元标识符?
谢谢
-EDIT!更新了CODE -
-(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;
}
你说的“自定义视图”是空的,但“图像正确显示” 。我不知道如何调和这两个陈述。但在回答你的问题时,'reloadData'是正确的技术。我会在各种'UICollectionViewDataSource'中放入日志语句或调试断点,并确认正在报告正确的值。这个集合视图最初是否正确工作,但在“解锁”一个关卡后不正确? – Rob
感谢您的评论罗布。 对不起,任何困惑,但它就像是重新加载时更改的单元格没有正确更改。 我试图NSLog的数据,它是正确的。但是,看起来像是当单元格被创建后,一旦它没有被“重新创建”,就会出现WillAppear。它们在退出视图并再次打开时正确显示。所以看起来问题是单元格仍然在内存中而不是重新加载? – CCDEV
通常你会在你的'viewWillAppear'或'viewDidAppear'中编写代码,它会调用'reloadData'(在调用'super'后)。为了重复我自己,我会将log语句放在'numberOfItemsInSection'和'cellForItemAtIndexPath'中,这样您就可以确认reloadData在视图重新出现时被正确调用,因此您可以在该点检查模型结构的各种值。 – Rob