2016-05-21 9 views
0

によってnavigationControllerにおけるリファレンスviewControllersは、このコードは、私が求めています何を示していますスウィフト - インデックス番号

を2つの画面、rootViewControllerTableViewControllerを持つシンプルなアプリの場合は、rootVCがインデックスになります[0] navigationControllerで、

:次のビューは、今、私は rootViewController背後ViewControllersに appDelegateから managedObjectContextに合格しようとしています1

import UIKit 
import CoreData 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

     let navController = self.window?.rootViewController as! UINavigationController 
     let firstViewController = navController.viewControllers[0] as! firstViewController 
     firstViewController.managedObjectContext = self.managedObjectContext 

     return true 
    } 

によってインデックスをインクリメントします

センタービューはrootViewControllerです。managedObjectContextをその上下左右の画面に渡したいと思います。

appDelegateからrootViewControllerに渡してから、rootViewControllerを渡してみましたが、動作しません。

誰でも同じビューのビューのインデックス番号を知る方法を教えてください。ありがとうございました!

+0

ナビゲーションコントローラのスタックで現在のビューのインデックスを調べるには、単に 'self.navigationController?.viewControllers.count-1'を使用します。なぜあなたがこれを必要とするのかという疑問からはっきりしない。 – shim

答えて

1

今、私はあなたがすることはできませんrootViewController

背後ViewControllersにappDelegateからmanagedObjectContextに合格しようとしています。アイデア全体は意味をなさない。アプリケーションデリゲートのコードが実行されるとき、それらのビューコントローラはまだ存在しません。ストーリーボードは、将来のために命令のセットであるインスタンスのビューコントローラの; application:didFinishLaunchingWithOptions:の間にそのようなインスタンスはありません - あなたが作成した最初のものを明示的にあなたのコードの中に置いている点を除き、

代わりに、これらのビューコントローラのそれぞれは、(例えばそのviewDidLoadような)独自のコードでは、アプリデリゲートからmanagedObjectContextをフェッチする必要があります。これは、アプリケーションの代理人がmanagedObjectContextプロパティを持っているため、すべてと表示されるため、というプロパティを参照することができます(共有アプリケーションのdelegateであるため)。

0

私は、ビューコントローラや他のオブジェクトからアプリデリゲートを取得することは、ストアドプロパティを取得するだけで問題ないと考えているため、上記の答えにはまったく賛成できません。

segueを実行している場合や次のビューコントローラに割り当てる場合は、prepareForSegueメソッドを使用してビュー階層を下に移動するときに、依存関係注入の概念を使用してビューコントローラにmanagedObjectContextを渡します。それをインスタンス化してナビゲーションスタック上にプログラムでプッシュします。

// App delegate: - didFinishLaunchingWithOptions 
    let navCon = window?.rootViewController as? UINavigationController 
    let rootVC = navCon?.viewControllers.first as? firstViewController 
    rootVC?.managedObjectContext = managedObjectContext 

    // FirstViewController: - Using segue 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     guard let identifier = segue.identifier else { return } 
     switch identifier { 
     case "SecondView": 
     let navCon = segue.destinationViewController as? UINavigationController 
     let controller = navCon?.topViewController as? SecondViewController 
     controller?.managedObjectContext = self.managedObjectContext 
     default: 
     break 
     } 
    } 

    // FirstViewController: - Pushing programmatically 
    let controller = SecondViewController() 
    controller.managedObjectContext = self.managedObjectContext 
    navigationController?.pushViewController(controller, animated: true) 
関連する問題