2

ビュー コントローラー (ビュー コントローラー 1) でコア データを使用しているテーブルビューのデータを更新しようとしています。値をコア データに保存するために使用される保存ボタン (UIButton) は、別のビュー コントローラー (ビュー コントローラー 2) にあります。

それらは同時に iPad 上の同じ画面上にありますが、Container Views を使用して別のクラス (ヘッダー ファイルとメイン ファイル) を持っています。View Controller 1 で保存ボタンをクリックしても、View Controller 2 にあるテーブル ビューが更新されません。

ただし、データを Core Data に保存する方法ではないことはわかっています。アプリケーションを更新すると、想定どおりに新しいセルがテーブル ビューにポップアップするためです。次の方法を試して、テーブルビューを更新しようとしましたが、うまくいきませんでした。

// ViewController1.m (Save Button)

- (IBAction)saveMethod {

    //Core Data Save Method Goes Here (Irrelevant)

    [self.managedObjectContext save:nil];

    //ViewController2 has the table view
    ViewController2 *trackingView = [[ViewController2 alloc] init];

    trackingView.managedObjectContext = self.managedObjectContext;
    [trackingView setupFetchedResultsController];
    [trackingView.view setNeedsDisplay];
    [trackingView.table reloadData];
} 

このテーブル ビューを別のビュー コントローラーから更新するように指示する方法がわかりません。

4

2 に答える 2

2

現在行っているように、viewcontroller を再作成する必要はありません。

NSManagedObjectContext保存操作を完了すると、通知が送信されます。これらの通知を受け取るために、任意のオブジェクトを登録できます。のデリゲートを再設定fetchedResultsControllerするオプションがない場合 (つまり、が既にデリゲートとして設定されており、が引き続きデリゲートとして機能するViewController1ことが理にかなっている場合) は、これを考慮してください。ViewController1

ViewController2データを処理している管理オブジェクト コンテキストへの参照が必要になるため、プロパティを作成して適切に設定する必要があります ( @property NSManagedObjectContext *moc)。

次に、通知viewDidLoadに登録できます。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleNotification:)
                                             name:NSManagedObjectContextDidSaveNotification
                                           object:self.moc];

ViewController2メソッドを定義する必要がありますhandleNotification::

-(void)handleNotification:(NSNotification*)notification {
    if ( [notification.name isEqual:NSManagedObjectContextDidSaveNotification] && [notification.object isEqual:self.moc] ) {
        [self.tableView reloadData];
    }
}

このアプローチに関するいくつかの注意事項:

  1. ビューコントローラーが閉じられたら、必ず を呼び出して[[NSNotificationCenter defaultCenter] removeObserver:self]ください。通知センターはオブザーバーを保持します (私はかつて難しい方法を見つけました)。
  2. 通知を登録するときは常に管理オブジェクト コンテキストを含めます。すべての保存通知に応答する必要はありません。
于 2013-03-17T02:13:33.757 に答える
0

ViewController2既に更新しなければならないインスタンスを目標とする場合、おそらく新しいインスタンスを作成したくないでしょう。実際、あなたの問題はViewController2ここではなく にあります。

がフェッチされた結果コントローラーのデリゲートとして設定されていることを確認しViewController2てから、フェッチされた結果コントローラーのデリゲート コールバックからテーブル ビューを更新します。また、両方のビュー コントローラーが同じ管理対象オブジェクト コンテキストを参照していることを確認してください。

于 2013-03-17T02:02:20.607 に答える