14

UITabBarController を保持する MainWindow.xib を持つ iPhone アプリケーションがあります。これは、ViewControllers 配列に UINavigationController とカスタム UIViewController サブクラスを持ちます。UINavigationController のルート ビュー コントローラーとカスタム ビュー コントローラーは、どちらも他の xib ファイルから読み込まれます。

アプリはコア データを使用し、スタックはアプリ デリゲートで初期化されます (規約に従って)。

アプリ デリゲートは、UITabBarController をウィンドウに追加します。

- (void)applicationDidFinishLaunching:(UIApplication *)application {        
    // Configure and show the window
    [window addSubview:[tabBarController view]];
    [window makeKeyAndVisible];
}

アプリのデリゲートで作成された ManagedObjectContext へのポインターを伝達する必要があることは認識していますが、続行する方法がわかりません (ここここのトピックに関するすべての優れた解説を読んでも):

  • ManagedObjectContext を UITabBarController に伝播し、そこから個々のビュー コントローラに伝播しますか? もしそうなら、どのように?
  • または、ManagedObjectContext を UINavigationController のルート ビュー コントローラーとカスタム ビュー コントローラーに直接伝達する必要がありますか?

UITabBarController の操作方法を十分に理解していないと思います。

4

9 に答える 9

14

NSManagedObjectContextNSFetchedResultsControllerまたは関連するNSManagedObject「ダウン」をに渡すのが理想的ですUIViewController。これにより、「親」が「子」を制御し、子が持つべきものを決定できます。これにより、より疎結合の設計が作成さUIViewControllerれ、必要に応じてインスタンスを簡単に再配置できます。また、再利用が容易になりUIViewControllerます。

タブ ビューのデザインでも同じです。AppDelegate は、に入る初期インスタンスNSManagedObjectContextの作成を担当する人に を渡します。次に、その作成者は、関連情報 ( 、、および/またはインスタンス) をインスタンスの構築時にインスタンスに渡します。UIViewControllerUITabBarControllerNSManagedObjectNSFetchedResultsControllerNSManagedObjectUIViewController

于 2010-01-15T17:07:23.497 に答える
11

依存性注入メソッドを使用して管理対象オブジェクト コンテキストをタブ バー コントローラーに渡したい場合、より堅牢なソリューションは、 のすべてのビュー コントローラーでループすることですapplicationDidFinishLaunching

for (id vc in tabBarController.viewControllers) {
    [vc setManagedObjectContext:self.managedObjectContext];
}
于 2010-01-15T11:57:06.920 に答える
1

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

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

IBOutlet UINavigationController *navigationController;

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

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

Alex(別の投稿から)は正しいです。「通常、アプリデリゲートから共有オブジェクトを取得しないようにする必要があります。これにより、グローバル変数のように動作しすぎて、問題が発生します。」

于 2011-02-05T16:18:05.353 に答える
1

CoreDataBooks サンプル アプリケーションをよく調べた結果、次のようになりました。

  • アプリ デリゲートの RootViewController (UINavigationController のトップ ビュー コントローラー) と MapViewController (カスタム ビュー コントローラー) への IBOutlets を作成しました。
  • MainWindow.xib のビュー コントローラーにアウトレットを接続しました。
  • に次のコードを追加しましたapplicationDidFinishLaunching

    // pass the managed object context to the view controllers
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    rootViewController.managedObjectContext = self.managedObjectContext;
    
    mapViewController.managedObjectContext = self.managedObjectContext;
    

そして今、それは魅力のように機能します。

于 2010-01-15T10:58:40.927 に答える
0

各viewControllerをループして、managedObjectContextプロパティがあるかどうかを確認し、ある場合は設定します。これは、私が見つけた最もクリーンな方法です。

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
for (id viewController in [tabBarController viewControllers]) {
    if ([viewController respondsToSelector:@selector(setManagedObjectContext:)]) {
        [viewController setManagedObjectContext:self.managedObjectContext];
    }
}
于 2015-11-13T04:02:16.570 に答える
0

こんにちは、これが古いスレッドであることは知っていますが、TABS 間で MOC を共有するための最良の方法を見つけるのにも問題があります。この件に関する Marcus Zarra のリンクがまだアクティブであることを願っています。マーカスは完全にロックし、データをクールにします。

これは、アプリケーション didFinishLaunching での私の現在のソリューションです。

NSArray *viewControllers = [tabBarController viewControllers];
    NSManagedObjectContext *context = self.managedObjectContext;
    for (id viewController in viewControllers) {
        [viewController setManagedObjectContext:context];

}
于 2010-11-21T18:56:10.590 に答える
-1

より簡単な解決策は、ManagedObjectContextをアプリデリゲートのパブリックプロパティにして、アクセスが必要な場所で次のようにすることです。

[[[UIApplication sharedApplication] delegate] sharedManagedObjectContext];

sharedManagedObjectContextがプロパティ名であると想定します。

于 2010-01-15T09:48:17.167 に答える