0

私はこのアイテムに関するほとんどの質問を読んでいますが、どういうわけか私はこれを理解することができません。

私は、ManagedObjectContextをAppDelegateから、最初のviewControllerがデータも処理する以前のアプリケーションの最初のビューに簡単に引き渡すことができました。

私が構築している新しいアプリケーションでは、ユーザーが(いくつかの可能なボタンを使用して)選択する必要がある初期画面が必要です。この画面では、トラブルシューティングに従ってMOCはそのままです(NSLogメッセージはMOCの有効なアドレスを示します)。

選択が行われると、アプリはTableViewを含むUIViewControllerに進みます。このビューでは、データを管理できるはずですが、MOCはnilを返します。

アプリは、UINavigationControllerを介して次のビューに進みます。

AppDelegateに次のコードを組み込みました。

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
InitialViewController *controller = (InitialViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;

InitialViewControllerは最初のViewControllerであり、すべてが正常です。

次のビューコントローラはMasterViewControllerと呼ばれ、NSFetchedControllerDelegateです。ここでは、NOCにアクセスできないようです。同じトピックに関する以前の質問で提案されたいくつかのアプローチと解決策を試しましたが、どれもうまくいかないようです。

適切なコーディングでNOCをMasterViewControllerで機能させるにはどうすればよいですか?

そうそう、うまくいった解決策の1つは、MasterViewControllerのViewDidLoadの後に、次のコードを挿入することです。

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

私のMOCは現在利用可能ですが、これは正しい方法ですか?

4

2 に答える 2

0

ストーリーボードを使用している場合は、

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [super prepareForSegue:segue sender:sender];
    if ([[segue identifier] isEqualToString:@"segueNameOfPresentingYourModalViewController"] == YES) {
        UINavigationController *navigationController = segue.destinationViewController;
        YourCustomViewController *aController = (YourCustomViewController *)navigationController.topViewController;
        aController.managedObjectContext = self.managedObjectContext;
    }
    else if ([segue.identifier isEqualToString:@"segueNameOfPushingYourViewController"] == YES) {
        YourCustomViewController *aController = segue.destinationViewController;
        aController.managedObjectContext = self.managedObjectContext;
    }
}

ストーリーボードを使用していない場合は、同様に、プッシュまたは提示しようとしている場所にViewControllerのmanagedObjectContextを設定します。もう1つの一般的な場所は-tableView:didSelectRowAtIndexPath:メソッドです。

于 2012-08-07T07:32:52.080 に答える
-1

「controller.managedObjectContext」と記述して、NSManagedObjectContext*プロパティをInitialViewControllerに明確に追加しました。同じプロパティをMasterViewControllerに追加し、self.managedObjectContextも割り当てる必要があります。

各コントローラーにmocを追加する必要がない場合は、MOCのグローバル変数を宣言するだけで問題はありません。

appDelegate.hで:

extern NSManagedObjectContext* moc;

これで、次のような.mがあります。

#import "AppDelegate.h"

mocにアクセスできるようになります。appDelegateにプロパティを追加するだけで、各コントローラーで次のことができます。

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
app.managedObjectContext
于 2012-08-07T03:20:31.477 に答える