0

現在、UITableView と NSFetchedResultsController を使用してデータを保存するプロジェクトに取り組んでいます。私が直面している問題は、セクションの使用が機能していないことです。

テーブルとして表示したいエンティティは、次の文字です。

  • チャンネル (文字列)
  • サーバー (文字列)
  • 名前 (文字列)

そして、サーバーに基づいたセクションが必要で、各セクションの行がチャネルです。レイアウトは次のようになります。

  • サーバー
    1チャネル1
    チャネル2
  • サーバー2
    チャンネル3
    チャンネル4
    など..

ただし、問題は、NSFetchedResultsController で要素を挿入/削除/変更しようとすると、アプリケーションが次のような例外を取得することです。

CoreData: エラー: 重大なアプリケーション エラーです。-controllerDidChangeContent: の呼び出し中に、NSFetchedResultsController のデリゲートから例外がキャッチされました。無効な更新: セクション数が無効です。更新後のテーブル ビューに含まれるセクションの数 (3) は、更新前のテーブル ビューに含まれるセクションの数 (2) に、挿入または削除されたセクションの数をプラスまたはマイナスした値 (0 挿入、0削除されました)。userInfo (ヌル)

私はいくつかの調査を行いましたが、UITableViewController デリゲートが最初に起動し、その時点では存在しない要素/セクションを表示しようとするためだと人々は言います。私はまだ解決策を見つけていません。それが私がここにいる理由です。

これは、NSFetchedResultsController のデリゲート メソッドです。

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

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;
    NSLog(@"--- Core Data noticed change");
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

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

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

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

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

どうもありがとう
ロバート

4

1 に答える 1

2

も実装する必要があります

 controller:didChangeSection:atIndex:forChangeType:

そうしないと、コア データ ストアで挿入または削除されたセクションがテーブル ビューに通知されません。

NSFetchedResultsControllerDelegate Protocol Referenceにサンプル実装があります。

于 2012-11-08T18:41:42.720 に答える