1

ここで単純な問題が発生したと思います。AppDelegate の managedObjectContext を 2 つのビュー コントローラーに渡そうとしています。この学習用デモでは、2 つの ViewController が隣り合っています。(私の実際のアプリでは、それらは遠く離れています。)

ここに画像の説明を入力

これは機能します:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

    Page1ViewController * page1VC = [[navigationController viewControllers] objectAtIndex:0];
    page1VC.managedObjectContext = self.managedObjectContext;

    return YES;
}

しかし、2 番目のビュー コントローラー (objectAtIndex:1) を追加すると、次のようにはなりません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

    Page1ViewController * page1VC = [[navigationController viewControllers] objectAtIndex:0];
    page1VC.managedObjectContext = self.managedObjectContext;

    Page2ViewController *page2VC = [[navigationController viewControllers] objectAtIndex:1];
    page2VC.managedObjectContext = self.managedObjectContext;

    return YES;
}

次のエラーが表示されます。

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

きっと正解に近い!? 誰かが助けてくれれば幸いです。(ちなみに、セグエを使用して managedObjectContext も渡します!)

4

1 に答える 1

2

ナビゲーションコントローラーは、インスタンス化されたときに、ナビゲーションツリー内のすべてのビューコントローラーをインスタンス化するわけではありません。代わりに、実際に画面に表示されようとしているときだけです。これは、メモリ管理にとって非常に良いことです。

前述のように、prepareForSegueを使用してMOCを簡単に渡すことができます。私が広く使用している別の解決策は、どこからでも使用できるMOCインスタンスを管理するためのヘルパークラスを作成することです。カスタムコンテキストの作成を管理し、スレッドセーフも処理します(作成されなかったスレッドでMOCを使用しないでください!1つのMOCを自由に渡すだけでこの問題が発生する可能性があります)

于 2012-06-23T18:39:46.617 に答える