9

「datasetType」でグループ化された UICollectionView に複数のセクションがあります。

各セクションにカスタム UICollectionViewCell もあります。

メソッドUICollectionViewCellで必要なカスタムをどのように判断できますか?cellForItemAtIndexPath

私の最初のことはに基づいていました[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 では、次のように作成します。

_fetchedResultsController = [Dataset MR_fetchAllSortedBy:NAME
                                               ascending:TRUE
                                           withPredicate:predicate
                                                 groupBy:@"datasetType"
                                                delegate:self.fetchedResultsController.delegate
                                               inContext:[NSManagedObjectContext MR_contextForCurrentThread]];

これにより、それらが取得され、名前で並べ替えられます。プロジェクトで Magical Record を使用していますが、そのフェッチ コントローラーを使用しているため、Core Data フェッチ コントローラーを動作させることができません。

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 のコンテキストが気に入らないと思います。/ボグル

各サブクラスUICollectionViewCell(DatasetACell、DataseetBCell など) を入力しようとすると、間違ったデータ セルが取得される可能性があります。

したがって、indexPath (0,0) では、NSFetchedResultsController

[self.fetchedResultsController sections] objectAtIndex:indexPath]

同じインデックスのコレクション ビューの間、datasetA エンティティを返します。

[collectionView dequeueReusableCellWithReuseIdentifier:datasetACell forIndexPath:indexPath] 

データセットBCellを返します。

NSFetchedResultsControllerがソートされていないのにがソートされているという問題があり[collectionView dequeueResuableCellwithReuseIdentifier:forIndexPath]ます。

完全なコード:

-(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
    }
}

ログ:

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

最初のインデックス (0,0) の場合、コードはそれを DatasetB と見なしますが、実際には DatasetA です。2 番目のインデックス (1,0) では、その反対です。コードはそれを DatasetA と考えていますが、DatasetB です。このセットには、1 つの DatasetB と多数の DatasetA があります。

フェッチ コントローラーがそれを並べ替えるとき、最初にデータセット B を並べ替えます。コレクション ビューは DatasetB を想定していますが、フェッチ コントローラーは同じインデックスに対して DatasetA を返しています。

4

3 に答える 3

1

モデル構造についての知識がなければ、これ以上確実なことは言えませんが、ここでは...

あなたの問題は、検索結果が特定の方法でソートされることを期待しているが、期待どおりにソートされていないことだと思います。

データセットはgroupBy:@"datasetType"、セクションを定義する句を使用しています。ただし、セクションはキーによって暗黙的にソートされgroupByます。質問は次のとおりです。

あなたのモデルのこのdatasetTypeキーは何ですか?それはあなたが期待するものですか? データセット名で並べ替えたいのは明らかですがdatasetType、名前は何ですか? ここに問題があると私は信じています。データセットの名前でグループ化していないため、間違った並べ替え順序を取得しています。

PS: 「DATSET A」と「DATASET B」があります...したがって、実際にデータセット名でグループ化されている場合、すべて期待どおりに機能しています...名前にタイプミスがある場合を除きます。

于 2013-04-05T04:06:56.713 に答える
0

データセット名にタイプミスがあるようです:

2013-04-04 10:59:38.704 [2380:14003] section name is DATSET A

DATSET A で 2 番目の「A」が欠落しているため、これは DATASET B の後にソートされます。

リテラルの危険性。

于 2013-04-06T05:15:28.887 に答える