3

問題を解決する方法はわかりますが、なぜこれが機能しないのかわからないのが気になります。Core Dataを使用するUIViewControllerサブクラスがあるため、NSManagedObjectContextが必要です。コントローラは、タブコントローラ内にあるナビゲーションコントローラの下に配置されているnibファイルからロードされます。

initWithCoderとviewDidLoadでこれを実行しようとしましたが、何らかの理由で機能しません。

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[appDelegate managedObjectContext] retain];

何らかの理由で、managedObjectContextはnilを返します。後で管理対象オブジェクトを作成しようとすると、次のようになります。

***キャッチされなかった例外「NSInternalInconsistencyException」が原因でアプリを終了しています。理由:「+ entityForName:このモデルで「LogRecord」という名前のエンティティを見つけることができませんでした。」

これは、コンテキストがnilの場合、またはモデルをロードできない場合(または実際にエンティティがない場合)に得られるものです。

saveLogEntryメソッド(管理対象オブジェクトを作成してコンテキストを保存する)の先頭でまったく同じことを行うと、問題なく機能します。

Recipesサンプルアプリケーションが行うことを行う場合:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    loggingViewController.managedObjectContext = self.managedObjectContext;

    // Standard stuff
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

(loggingViewControllerは、アプリデリゲートのIBOutletです)。

ここで具体的に何が起こっているのか誰か知っていますか?「早すぎる」と失敗したように見えますが、特にviewDidLoadの場合は、addSubviewが呼び出された後に発生すると思うので、機能すると思います。

4

1 に答える 1

6

レシピアプリが行うことを正確に実行します。

initWithCoderで試してみると、アプリデリゲートが初期化を完了したかどうかはわかりません(まだ完了していません)。

viewDidLoadを試してみると、同様の問題が発生します。

そのため、次のようにアプリデリゲートにアクセスしないでください。

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[appDelegate managedObjectContext] retain];

これは悪い形です。それはあなたのデザインにカップリングを導入します。例のように、依存性注入を使用します。それはあなたのアプリをより柔軟にします。

アプリデリゲートから、どの初期化が実行されたかを正確に把握し、適切なタイミングでコンテキストを渡すことができるためです。


アップデート:

問題は、ViewControllerインスタンスがMainwindow.xibでインスタンス化されている可能性が高いことです。Mainwindow.xib(およびそれが参照する他のnib)は、アプリデリゲートがUIApplicationDidFinishLaunchingNotification通知を受信する前に「解凍」されます。

オブジェクトがペン先から解凍される順序は保証されません。View ControllerでinitWithCoder:が呼び出されると、ペン先から解凍された他のオブジェクトがわかりません。また、アプリデリゲートがUIApplicationDidFinishLaunchingNotification通知を受信したかどうかを確認することもできません。

viewDidLoadについても同様です。viewDidLoadでは、nib内の他のすべてのオブジェクトが適切に解凍および初期化されていることを確認できますが、アプリデリゲートの構成はnibファイルの外部で行われるため、アプリを安全に呼び出すことができるかどうかはわかりません。委任します。

アプリデリゲートが「適切で準備ができている」場合、できればapplicationDidFinishLaunching:メソッドで、コンテキストに渡すだけの方が適切です。

それがもう少し明確になることを願って、あなたはiphoneプログラミングガイドを見る必要があります:http: //developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/index.html

iPhoneアプリケーションのライフサイクルのより良い説明を収集するため。

お役に立てば幸いです。


もう1つの更新:

iPhoneの起動シーケンスの詳細については、http://www.bit-101.com/blog/ ? p=2159をご覧ください。

于 2010-01-07T18:13:06.890 に答える