iOS에서 UICollectionview를 다시로드하려고 할 때 probem이 있습니다.UICollectionview를 언로드하고 새로 고침 하시겠습니까?
게임의 레벨을 표시하는 데 사용하고 있습니다.
콜렉션 뷰는 10 개의 셀로 구성됩니다. 레벨이 잠금 해제되어 있는지 여부에 따라 셀의 내용이 달라집니다. 레벨이 잠금 해제되어 있으면 셀이 레벨 (사용자 정의 UIView)을 표시하고, 그렇지 않으면 이미지를 표시합니다. 이 작업을 위해 개별 셀 식별자를 만들어야했고 모든 것이로드시 완벽하게 표시됩니다.
내 문제는 사용자가 잠금 해제 된 수준을 재생하고 다음 수준을 잠금 해제 할 때입니다. 사용자가 게임보기에서 레벨 선택보기로 다시 이동하면 셀이 올바르게 다시로드되지 않습니다. 사용자 정의보기가 있어야하며 이미지가 올바르게 표시됩니다.
viewWillAppear의 레벨로 배열을 언로드 한 다음 [collectionview reloadData]를 호출하고 레벨을로드하고 collectionview를 다시로드하려고 시도했지만 도움이되지 않습니다.
전체 콜렉션 뷰를 비우고 뷰가 표시되면 어떻게 셀 식별자를 다시 만들 수 있습니까?
감사합니다.
-EDIT! 코드로 업데이트 -
그리고 항목의 셀에
-(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'를 호출 한 후)를 호출하는 코드를 작성합니다. 자신을 반복하기 위해서'numOfItemsInSection'과'cellForItemAtIndexPath'에 로그 문을 넣었습니다. 그래서 뷰가 다시 나타나면'reloadData'가 제대로 호출되는지 확인하고 그 시점에서 모델 구조의 다양한 값을 확인할 수 있습니다 . – Rob