【发布时间】:2013-06-20 11:42:36
【问题描述】:
尝试在 iOS 中重新加载 UICollectionview 时遇到问题。
我用它来显示游戏中的关卡。
collectionview 由 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;
}
【问题讨论】:
-
您说“自定义视图”是空的,但“图像显示正确”。我不知道如何调和这两种说法。但在回答您的问题时,
reloadData是 正确的技术。我会在您的各种UICollectionViewDataSource中放入日志语句或调试断点,并确认正在报告正确的值。此集合视图最初是否正常工作,但在“解锁”关卡后无法正常工作? -
感谢您的评论罗。很抱歉有任何混淆,但这就像假设在重新加载时更改的单元格没有正确更改。我曾尝试对数据进行 NSLog,它是正确的。但是,当单元格在视图 WillAppear 上未“重新创建”时创建时,似乎是这样。退出视图并再次打开时,它们会正确显示。所以看起来问题是单元格仍在内存中并且没有被重新加载?
-
通常您会在
viewWillAppear或viewDidAppear中编写调用reloadData的代码(在调用super之后)。再说一遍,我将日志语句放在numberOfItemsInSection和cellForItemAtIndexPath中,这样您就可以确认当视图重新出现时reloadData被正确调用,因此您可以在那时检查模型结构的各种值.
标签: ios uicollectionview reloaddata collectionview