2

iPhone アプリがクラッシュすると、コンソールに次のエラーが表示されます。

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2372/UITableView.m:1070

このコード行に到達するとクラッシュし、これが表示されます。

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

私のアプリと、どのようにしてこれにたどり着いたかについて少し詳しく説明します。コア データ オブジェクトを表示するテーブル ビューを持つビュー コントローラーがあります。2 つのエンティティからのデータを表示するようにこのビューを設定したので、テーブル セクション 1 にはエンティティのオブジェクトが表示され、セクション 2 には 2 番目のエンティティからのオブジェクトが表示されます。

これが私の問題の始まりです。これはかなりうまくいきましたが、次のビュー コントローラーをプッシュして最初のエンティティにオブジェクトを追加し、問題なくテーブルビュー コントローラーに戻すことができます。ただし、オブジェクトを 2 番目のエンティティに追加しようとすると、tableviewcontroller に戻ると、上記のようにクラッシュします。

これの原因を特定できないため、どこから調べればよいかわかりません。

コンソールからの追加のエラー情報:

CoreData: エラー: 重大なアプリケーション エラーです。-controllerDidChangeContent: の呼び出し中に、NSFetchedResultsController のデリゲートから例外がキャッチされました。無効な更新: セクション 0 の行数が無効です。更新後の既存のセクションに含まれる行数 (2) は、更新前にそのセクションに含まれる行数 (2) に、その数をプラスまたはマイナスした値と等しくなければなりません。そのセクションに挿入または削除された行の数 (1 挿入、0 削除)、およびそのセクションに移動された、またはそのセクションから移動された行数 (0 移動、0 移動)。userInfo (ヌル)

コード:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSInteger rows;

    id <NSFetchedResultsSectionInfo> sectionInfoAccounts = [[fetchedResultsControllerAccounts sections] objectAtIndex:0];
    id <NSFetchedResultsSectionInfo> sectionInfoCosts = [[fetchedResultsControllerCosts sections] objectAtIndex:0];

    if (section == 0) rows = [sectionInfoAccounts numberOfObjects];
    else if (section == 1) rows = [sectionInfoCosts numberOfObjects];

    return rows;
}
4

1 に答える 1

2

テーブル ビューに 2 つのフェッチ済み結果コントローラーを使用しています。1 つの FRC をテーブル セクション 0 に、もう 1 つの FRC をテーブル セクション 1 に使用しています。

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

関数が 2 番目の FRC に対して呼び出された場合、indexPath/のセクション部分newIndexPathは 0 です (FRC にはセクションが 1 つしかないため)。ただし、対応するテーブル セクションは 1 です。

insertRowsAtIndexPaths:...したがって、insertRowsAtIndexPaths:...などを呼び出す前に、FRC インデックス パスをテーブル ビューのインデックス パスにマップする必要があります。

たとえば、挿入イベントの場合:

NSIndexPath *newIndexPath1 = [NSIndexPath indexPathForRow:newIndexPath.row inSection:1];
[self.tableView insertItemsAtIndexPaths:@[newIndexPath1]];

そうしないと、2 番目のエンティティの新しいオブジェクトが最初のテーブル ビュー セクションの行として挿入され、不整合の例外が発生します。

于 2012-10-06T08:50:37.200 に答える