0
         appdelegate
     passes modelview 
     to each tab controller
            |
            |
          /    \
         /      \   
        /        \
       /          \ 
      /            \
     /              \
    vc1             vc2
 show list      show grouped  
 of years     table with years
    |          as headers and
    |           courses within
   vc3            each year
list courses
in selected 
year
   |
   |
add new 
course to
selected 
year

vc1 と vc2 の両方で、コア データ モデルから読み取っているエンティティは「年」です。「numberOfRowsInSection()」などのルーチンでは、NSSet() を介して、モデルの「対多」関係を介してコースにアクセスします。(つまり、courses_rel)。これはすべて、両方のビューの初期表示で正常に機能します。

vc3もうまく機能します。ユーザーは、選択した任意の年に新しいコースを追加できます。

これが私の問題です。ユーザーが vc3 経由で新しいコースを追加してから vc2 に切り替えると、新しいコースが表示されず、以下のエラーが表示されます。変更はコースデータベーステーブルで行われたが、vc2 のテーブルビューは「年」テーブルからロードされているため、エラーが発生していることはわかっています。コースではなく「年」を扱っているため、「didChangeObject」やその他の関連メッセージを取得することはありません。ただし、グループ化された各セクションの本体はコースのリストです。

ユーザーが vc2 に移動するとすぐにコース テーブル (vc3) の変更が反映されるようにするにはどうすればよいですか?

新しいフェッチ操作と [view reloadData] を viewWillLoad 関数に配置しましたが、これはコースではなく年のフェッチであるため、効果はありません。

これは、ユーザーが vc3 でコースを追加した後に vc2 に切り替えたときに発生するエラーです。

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

4

2 に答える 2

1

VC2 の取得リクエストは、「年数」リクエストではなく「コース」リクエストである必要があります。フェッチされた結果コントローラーは、フェッチ リクエストから返された結果セットが変更された場合にのみ、変更を認識してデリゲート メソッドを呼び出します。新しいコースを追加すると、新しい年は作成されないため、フェッチされた結果コントローラーは変更を伝達しません。

コースエンティティに「年」の関係があると仮定すると、次のように初期化することで、取得した結果コントローラーを年ごとにグループ化するように構成できます。

 NSFetchedResultsController *myController = [[NSFetchedResultsController alloc] 
                                 initWithFetchRequest:<a courses fetch request> 
                                 managedObjectContext:context
                                   sectionNameKeyPath:@"year"
                                            cacheName:<cache name or nil>];

次に、テーブルビュー データソース メソッドを変更して、frc からのセクション情報を使用して、年間のセクションを作成し、セクションにコースを設定します。このようにすると、新しいコースが追加されるたびに、frc はデリゲート メソッドを介して vc2 に通知します。

于 2011-10-24T17:06:59.590 に答える
0

Core Data から同じエラー メッセージが表示されましたが、これが解決策でした。

https://developer.apple.com/library/content/releasenotes/iPhone/NSFetchedResultsChangeMoveReportedAsNSFetchedResultsChangeUpdate/

于 2016-09-14T05:48:08.337 に答える