4

建築に関する質問があります。私のアプリは、アプリケーション ウィンドウで TabBarController を使用します。ApplicationDelegate は managedObjectContext を作成しますが、実際には必要ありません。

TabBarController 内の各 ViewController は NavigationViewController です。各 NavigationController の最初のビュー コントローラーは、私のカスタム ビューです。すべてが Interface Builder を介してリンクされて作成されます。

では、managedObjectContext を正しい方法で渡すにはどうすればよいでしょうか。実際には、ユーザーがタブを選択するか、NavigationControllers をナビゲートするときに、データが既に存在するように、できるだけ早くデータを読み込むビューが必要です。

だから私の質問は:

  1. コンテキストを適切に渡すにはどうすればよいですか?
  2. いつ、どの方法でデータをフェッチする必要がありますか? 「viewDidLoad」または「viewDidAppear」?

すべてのアイデアをありがとう!

4

4 に答える 4

10

通常、アプリ デリゲートから共有オブジェクトを取得しないようにする必要があります。グローバル変数のように振る舞うようになり、それに関連して混乱した問題が発生します。また、シングルトンは単なる派手なグローバル変数であるため、本当に必要でない限り避けるべきです。

各View Controllerにプロパティを追加し、managedObjectContextそれらを作成するときに割り当てます。そうすれば、View Controller はアプリ デリゲートと緊密に連携しません。

データをいつ取得するかについては、遅延して行う必要があります。Core Data は非常に高速なのでviewWillAppear:、フェッチを行うまで待ちます。まで待つviewDidAppear:と、ビューはすでに画面に表示されており、データの読み込み時にちらつきが発生します。ただし、ビューが表示されるたびに呼び出されることに注意してviewWillAppear:ください (たとえば、ユーザーがナビゲーション バーの戻るボタンをタップしたとき、またはモーダル ビュー コントローラーが閉じられたとき)。データを読み込み、後続の呼び出しで読み込みをスキップします。

于 2010-11-04T19:59:49.183 に答える
2

私はこれと同じ問題に遭遇しました、私は私の解決策を共有します。

まず、nibファイルのタブバーにあるNav Controllerへの参照が必要です。必ず、接続してください。

IBOutlet UINavigationController *navigationController;

次に、サポートドキュメントで推奨されているようにコントローラーを取得し、managedObjectContextを送信します。

SavedTableViewController *saved = (SavedTableViewController *)[navigationController topViewController];
saved.managedObjectContext = self.managedObjectContext;

Alexは正しいです。「通常、アプリデリゲートから共有オブジェクトを取得することは避けてください。グローバル変数のように動作しすぎて、問題が発生します。」

于 2011-02-05T16:17:02.670 に答える
0

次のように、アプリのデリゲートからいつでも取得できます。

myApp *d = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = d.managedObjectContext;

または上記のバリエーション。それ以外に、すべてのビューコントローラーにプロパティを追加して渡すか、シングルトンを作成してそれをグローバルに参照できます。

于 2010-11-04T19:39:47.767 に答える