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 

によって認識されていない、私は私のコアデータモデルから読んでいたエンティティは、「年」です。 "numberOfRowsInSection()"などのルーチンでは、NSSet()を使用して、モデル内の "to-many"関係を通じてコースにアクセスします。 (すなわち、courses_rel)。これは両方のビューの最初の表示には問題ありません。コアデータ:1のUITableView /実体の変化は、VC1とVC2の両方で、他の「間接的」に関連UItableviews /エンティティ

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

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

コーステーブル(vc3)の変更をユーザーがvc2に移動した直後に反映させる方法を教えてください。

新しいフェッチ操作と[view reloadData]をviewWillLoad関数に配置しましたが、もう一度、それは何も効果がないように、フェーズではなく年です。

ユーザーがvc3でコースを追加した後にvc2に切り替えたときのエラーです。

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)

答えて

1

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

コースのエンティティは「今年の関係は、あなたがこのようにそれをinit'ingことにより、年によってグループにあなたのフェッチ結果コントローラを構成することができたと仮定すると:

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

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

+0

もう一度、ありがとう。あなたは、私がコアデータの私の理解を洗練させる助けを続けています。私は助けに感謝します。これを今試みている。すぐにあなたに戻ってください。 – phil

+0

「年」は、コースオブジェクトからの「1対1」の関係です。この節の名前キーパスの文脈で今年をどのように参照するのですか? sectionNameKeyPath:@ "year_rel.yearName"?それは正しく見えますか? – phil

+0

はい、上記の行に答えて、それは素晴らしい作品です。また、ロビンはその男です!ありがとう、ロビン。 – phil

関連する問題