5

UITableView入力されていNSFetchedResultsControllerます。最初のフェッチは正常に機能します。問題なく追加、削除、変更などを行うことができます..しかし、テーブルにユーザー定義の並べ替えを追加したいと考えています。を別のセットとNSFetchedResultsController別の を使用するように変更することで、これを行っています。フェッチを変更するコードは次のとおりです。sortDescriptorsectionNameKeyPath

-(void)changeFetchData {
    fetchedResultsController = nil;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSString *sortKey = @"sortKey";
    NSString *cacheName = @"myNewCache";
    BOOL ascending = YES;

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

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

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Fetch failed");
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [self.tableView reloadData];
}

このメソッドを呼び出すと、うまく機能します。テーブルは、新しいセクション情報と新しい並べ替えパラメーターを使用するために、すぐに並べ替えられます。しかし、データにアイテムを追加または削除すると、TableView はその情報を更新せず、クラッシュを引き起こします。fetchedResultsController 内のオブジェクトの総数のカウントを NSLog して、その増加 (および減少) を確認できますnumberOfRowsInSectionが、そこでの変化を監視するために戻り値を NSLog すると、メソッドが呼び出されますが、値は変化しません。次のクラッシュを取得します(追加用ですが、削除用も同様です)

無効な更新: セクション 2 の行数が無効です。更新後の既存のセクションに含まれる行数 (3) は、更新前にそのセクションに含まれる行数 (3) に、その数をプラスまたはマイナスした値と等しくなければなりません。そのセクションから挿入または削除された行数 (1 挿入、0 削除)。userInfo (ヌル)

アプリを再起動すると、追加されたアイテムが表示されるか、削除されたアイテムが表示されないため、データソースを正しく変更しています。

何か案は?

4

2 に答える 2

2

古いコントローラーがまだ生きている可能性があります。その場合、デリゲートとしてテーブルビュー コントローラーを呼び出し、独自のデータを使用してテーブルの更新を有効にしている可能性があります。

取得した結果コントローラー オブジェクトをログに記録しnumberOfRowsInSectionて、新しいコントローラーを使用していることを確認することをお勧めします。新しいコントローラーを割り当てる前に、古いコントローラーのデリゲートを nil に設定する必要があります。

于 2010-07-16T19:26:59.803 に答える