5

My RootViewControllerには、単純なテーブルビューが含まれています。表内の項目​​の1つを選択すると、DetailViewControllerが選択された項目の詳細が表示されます。関連するデータオブジェクトのデータは、CoreDataを介してロードされ、永続化されます。 didSelectRowAtIndexPath:メソッドのFetchedResultsControllerとManagedObjectContextをDetailViewControllerに渡すにはどうすればいいですか? DetailViewController.hの両方のプロパティを定義する必要がありますか?コードサンプルを私に提供できますか?要するに複数のView ControllerでFetchedResultsControllerとManagedObjectContextを使用する

答えて

19

最初に、各フェッチ結果コントローラ(FRC)インスタンスは各テーブルビューに固有に設定されるため、FRCをtableviewコントローラからtableviewコントローラに渡すことはありません。代わりに、各テーブルビューコントローラは、そのテーブルビュー専用の新しいFRCをインスタンス化して構成します。

テーブルビューがマスタービューであるマスター/ディテールデザインでは、FRCを詳細ビューに渡すのではなく、選択したテーブルビュー行で表される単一の管理オブジェクトだけを渡します。

アップルは、管理オブジェクトコンテキスト(MOC)を「依存性注入」によって渡すことを推奨しています。これは非常に簡単です。最も一般的な設計では、アプリケーションデリゲートのMOCを初期化し、それぞれのビューコントローラにmanagedObjectContextプロパティを指定します。次に、View Controllerをロード/プッシュするときは、MOCに対してプロパティーをmanagedObjectContextに設定するだけです。

たとえば、マスター/ディテールデザインでは、通常、ナビゲーションコントローラ(NAV)があります。これがどのように機能するかを確認するには、Xcodeでナビゲーションベースのアプリテンプレートを使用してテストアプリを作成します。コアデータを使用するようにマークします。アプリデリゲートとRootViewControllerの両方にmanagedObjectContextというプロパティがあります。アプリデリゲートのapplicationDidFinishLaunching:...方法で今

それのように見えるようにするコードを追加します。その後、RootViewController.mアドオンで...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    // Add the navigation controller's view to the window and display. 
    RootViewController *topVC=(RootViewController *) self.navigationController.topViewController; 
    topVC.managedObjectContext=self.managedObjectContext; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

を:

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"self.managedObjectContext = %@",self.managedObjectContext); 
    [super viewDidAppear:animated]; 
} 

テスト・アプリケーションを実行しますRootViewControllerオブジェクトは、managedObjectContextのようなプロパティをログに記録します。

2011-07-19 09:24:05.193 CDNavTemplate[3203:207] self.managedObjectContext = <NSManagedObjectContext: 0x4d318a0> 

... RootViewControllerオブジェクトに、アプリケーションデリゲートの管理オブジェクトコンテキストがあることを証明します。

ナビゲーションコントローラのスタックにプッシュしたすべてのビューコントローラに対して、同じプロセスを繰り返して、同じ管理対象オブジェクトコンテキストオブジェクトを順番にビュー階層に渡します。他のタイプのオブジェクトも同じ方法で渡すことができます。

Appleは、コードをモジュール化し、単一のアプリケーション内で複数の管理オブジェクトコンテキストを使いやすくするため、依存性注入を推奨しています。特定の時間に必要な特定のコンテキストを各ビューコントローラに渡すだけです。

+0

これは私にとって非常に貴重な情報です。私はすべての書籍とドキュメンテーションでそのような説明を探していましたが、見つけられませんでした。おかげで束 - あなたは私の一日を作った! – Otto64

+0

ドキュメントや書籍を書いている人は、APIを十分に理解しているので、初心者を混乱させるものを理解することは難しいです。トレーニングの分野では大きな問題です。私はいつもそれに対処しなければならない。 – TechZen

+0

甘い、すばらしい説明サー。 – nmdias

1

、二つのオプションがある:

  1. これら(FetchedResultsControllerとManagedObjectContext)の両方は、ビューコントローラのすべてがそれらにアクセスできる場所にある必要があります。たとえば、XcodeがデフォルトでManagedObjectContextを配置するApp Delegate内にある場合、この方法でアクセスすることができます(警告が表示されるため、アプリケーションのアプリケーションデリゲートクラスにデリゲートを入力する必要があります) :あなたがそれらを作成するときに
NSManagedObjectContext *context = [[[UIApplication sharedApplication] delegate] managedObjectContext];
  1. あなたが実際にあなたのビューコントローラにこれらの値を渡すことができます。たとえば、サブクラス(DataViewControllerなど)を作成し、このサブクラス(ManagedObjectContextおよびFetchedResultsController用)に2つのプロパティを設定すると、それらを作成するときに設定されます。
+0

FRCが各テーブルビューに固有であるため、フェッチされた結果コントローラをビューコントローラからビューコントローラに渡すべきではありません。各テーブルビューには独自のFRCが必要です。 – TechZen

関連する問題