2

確かに私は新しいです。批判歓迎。

さまざまな調整を 1 か月試した後も、問題は解決しません。簡単にするために: A、B、および C と呼ばれる 3 つのビュー コントローラーがあります
。B には、2 つのデータ フィールドを受け入れて新しいアイテムを保存し、ビュー C をポップしてビュー B を表示する C にセグエするためのナビゲーション バー ボタン (追加) があります。

ビュー C から新しい項目を追加してビュー B に戻ると、正しくソートされたリストが得られます。しかし、ビュー B からビュー A に戻り、再度ビュー B に移動すると、リストが正しくソートされません。ビュー B が表示されるたびに、新しい Fetched Results Controller が作成されます。A に戻る、B に戻る ビューが正しくソートされていません。繰り返します - 同じ問題。しかし、A に戻って3 秒待ってから B に移動すると、リストが正しくソートされます。キャッシュを nil に設定して試し、ビューが消えると削除される値に設定しました。

以降のビュー B の新しい表示では、正しくソートされたリストが表示されます。誤った並べ替え順序は、上記の順序でのみ発生します。1 つの項目を追加した後、1 つのビューに戻り、FRC によって供給されたテーブル ビューを再表示します。

質問や提案を歓迎します。前もって感謝します。元の質問の残りの部分を以下に示します。

項目を追加する別のビューへのセグエを使用してNSFetchedResultsController、テーブル ビューをアルファベット順に入力しています。メイン テーブルに戻ると、並べ替えはランダムです。ビューを終了して、階層の前のビューに戻り、ビューをリロードしても、ランダムに並べ替えられます。これを連続して数回繰り返すことができます。ただし、数秒待ってから同じ手順を実行すると、ビューが正しく並べ替えられます。保存されたファイルから読み取るときに正しい並べ替えが行われるようです。これは、「しばらくしてから」自動的に行われることを理解しています。キャッシュは nil に設定されます。

アイテムを追加するメソッドでテーブルビューを呼び出してから呼び出し、データを強制的に保存してからテーブルをリロードしようとしていますsaveContextreloadDataビューにNSFetchedResultsControllerDelegateセットしています。

助言がありますか?

フェッチされた結果コントローラーのコードは次のとおりです。

- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Player"];
    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor * lastNameSort = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    NSSortDescriptor * firstNameSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];

    fetchRequest.sortDescriptors = [NSArray arrayWithObjects: lastNameSort, firstNameSort, nil];

    NSFetchedResultsController * frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    frc.delegate = self;

    NSError *error = nil;
    if (![frc performFetch:&error]) {
        //  Handle the error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    _fetchedResultsController = frc;
    return _fetchedResultsController;
} 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller 
  didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:  
  (NSFetchedResultsChangeType)type   {

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                          withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                          withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
     Player * player = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = player.fullName;
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:
     (id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:   
      (NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
                    atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
            break; 
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
4

0 に答える 0