내 UICollectionView에 "datasetType"으로 그룹화 된 여러 섹션이 있습니다.여러 하위 클래스가있는 UICollectionView UICollectionViewCell
또한 각 섹션에 대해 사용자 지정 UICollectionViewCell이 있습니다.
cellForItemAtIndexPath
방법에서 어떤 맞춤 UICollectionViewCell
이 필요한지 어떻게 결정할 수 있습니까?
내 첫번째 생각이었다 [sectionInfo name]
의 기반으로 이동 :
id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:indexPath.section];
if ([[sectionInfo name] isEqualToString:@"DatasetA"]) {
DatasetACell *datasetACell = [collectionView dequeueReusableCellWithReuseIdentifier:datasetACellIdentifer forIndexPath:indexPath];
DatasetA *datasetA = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
그러나 나는 그것의 잘못된 데이터 셋 셀을로드 할 문제로 실행 해요.
이 작업을해야하며 오류가있는 곳을 찾아야합니까? 아니면이 부분을 잘못하고 있습니까?
편집 :
내가해야 할 일. 문제는 인덱스가 일치하지 않는다는 것입니다.
_fetchedResultsController = [Dataset MR_fetchAllSortedBy:NAME
ascending:TRUE
withPredicate:predicate
groupBy:@"datasetType"
delegate:self.fetchedResultsController.delegate
inContext:[NSManagedObjectContext MR_contextForCurrentThread]];
이 그들을 가져와 이름을 정렬 : 내 fetchedResultsController를 들어
, 나는로 만들 수 있습니다. 내가 코어 데이터가 작동하는 컨트롤러를 가져 얻을 수없는 컨트롤러 원인을 가져 내가 프로젝트에 마법 기록을 사용하고, 나는 그것을 사용NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Dataset" inManagedObjectContext:[NSManagedObjectContext MR_contextForCurrentThread]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:NAME ascending:TRUE selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error;
NSArray *fetchedArray = [[NSManagedObjectContext MR_contextForCurrentThread] executeFetchRequest:fetchRequest error:&error];
NSLog(@"fetchedArray: %@", fetchedArray);
NSFetchedResultsController *FRC = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext MR_contextForCurrentThread] sectionNameKeyPath:nil cacheName:nil];
FRC.delegate = self;
이 코드는 개체를 반환으로 수행 fetchRequest를, 그 한 번 나는 그것을 넣어 가져 오기 컨트롤러를 통해 항상 아무것도 반환하지 않습니다. 나는 MR의 문맥을 좋아하지 않는다고 생각한다./boggle
서브 클래스 UICollectionViewCell
(DatasetACell, DataseetBCell 등)을 채울 때 잘못된 데이터 셀을 검색 할 수 있습니다. 같은 인덱스
[collectionView dequeueReusableCellWithReuseIdentifier:datasetACell forIndexPath:indexPath]
에 대한 콜렉션 뷰가 datasetBCell을 반환하면서 NSFetchedResultsController
[self.fetchedResultsController sections] objectAtIndex:indexPath]
의 indexPath (0,0)에 따라서
는 datasetA 개체를 반환합니다.[collectionView dequeueResuableCellwithReuseIdentifier:forIndexPath]
이 정렬되지 않은 동안 NSFetchedResultsController
이 정렬되는데 문제가 있습니다.
전체 코드 :
-(NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"boundary.boundaryID == %@", self.dataseter.boundaryID];
_fetchedResultsController = [Dataset MR_fetchAllSortedBy:NAME
ascending:TRUE
withPredicate:predicate
groupBy:@"datasetType"
delegate:_fetchedResultsController.delegate
inContext:[NSManagedObjectContext MR_contextForCurrentThread]];
return _fetchedResultsController;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:indexPath.section];
NSLog(@"indexPath: %@", indexPath);
NSLog(@"[sectionInfo name]: %@", [sectionInfo name]);
if ([[sectionInfo name] isEqualToString:SAVED_ANALYSIS]) {
NSLog(@"section name is DATASET A");
DatasetCellA *datasetCellA = (DatasetCellA *)[collectionView dequeueReusableCellWithReuseIdentifier:datasetcellAIdentifier forIndexPath:indexPath];
DatasetA *datasetA = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"datasetA.id: %@", datasetA.id);
NSLog(@"datasetA: %@", datasetA);
// configure and return cell
}
else if ([[sectionInfo name] isEqualToString:EDITED_IMAGES]) {
NSLog(@"section name is DATASET B");
DatasetCellB *datasetCellB = (DatasetCellB *)[collectionView dequeueReusableCellWithReuseIdentifier:datasetCellBIdentifer forIndexPath:indexPath];
DatasetB *datasetB = [self.fetchedResultsController objectAtIndex:indexPath];
NSLog(@"editedImage.id: %@", datasetB.id);
NSLog(@"editedImage: %@", datasetB);
// configure and return cell
}
}
LOG : 최초의 인덱스 (0, 0)에 대한
2013-04-04 10:59:38.697 [2380:14003] indexPath: <NSIndexPath 0x19b645c0> 2 indexes [0, 0]
2013-04-04 10:59:38.697 [2380:14003] [sectionInfo name]: Dataset B
2013-04-04 10:59:38.697 [2380:14003] section name is DATASET B
2013-04-04 10:59:38.702 [2380:14003] datasetB.id: 1581
2013-04-04 10:59:38.703 [2380:14003] datasetB: <DatasetA: 0x1c193ac0> (entity: DatasetA; id: 0x16141bd0 <x-coredata://9313C8D3-0AA8-4F3F-B32D-F1F7843D4FA1/DatasetA/p168> ; data: {
})
2013-04-04 10:59:38.703 [2380:14003] indexPath: <NSIndexPath 0x19b64560> 2 indexes [1, 0]
2013-04-04 10:59:38.703 [2380:14003] [sectionInfo name]: Dataset A
2013-04-04 10:59:38.704 [2380:14003] section name is DATSET A
2013-04-04 10:59:38.709 [2380:14003] datasetA.id: 75
2013-04-04 10:59:38.709 [2380:14003] datasetA: <DatasetB: 0x1c15a830> (entity: DatasetB; id: 0x16141b30 <x-coredata://9313C8D3-0AA8-4F3F-B32D-F1F7843D4FA1/DatasetB/p165> ; data: {
})
2013-04-04 10:59:38.724 [2380:14003] -[DatasetB mode]: unrecognized selector sent to instance 0x1c15a830
2013-04-04 10:59:38.725 [2380:14003] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DatasetB mode]: unrecognized selector sent to instance 0x1c15a830'
*** First throw call stack:
(0x1c19012 0x1a3ee7e 0x1ca44bd 0x1c08bbc 0x1c0894e 0x80028 0xe862da 0xe878f4 0xe89b91 0x9d32dd 0x1a526b0 0x56cfc0 0x56133c 0x561150 0x4df0bc 0x4e0227 0x4e08e2 0x1be1afe 0x1be1a3d 0x1bbf7c2 0x1bbef44 0x1bbee1b 0x28cc7e3 0x28cc668 0x982ffc 0x1ebd 0x1de5)
libc++abi.dylib: terminate called throwing an exception
는 코드는이 DatasetB하지만 실제로 DatasetA입니다 생각한다. 두 번째 인덱스 (1,0)에서 그 반대; 코드는 DatasetA라고 생각하지만 DatasetB입니다. 이 집합에는 1 개의 DatasetB와 많은 DatasetA가 있습니다.
반입 컨트롤러가이를 정렬 할 때 먼저 데이터 세트 B를 정렬합니다. 컬렉션 뷰는 DatasetB를 기대하지만 가져 오기 컨트롤러는 동일한 인덱스에 대해 DatasetA를 반환합니다.좀 더 확실한, 그러나 여기 간다 수없는 모델 구조의 더 많은 지식없이
다른 셀 유형에 대해 고유 한 재사용 식별자를 설정 했습니까? 당신이 가진 것은 꽤 많은 일을해야합니다. – dasblinkenlight
그것이 제가 확인한 첫 번째 것입니다. – Padin215
'NAME '이란 무엇입니까? –