一般に、システムはストーリーボードを使用してビューコントローラーのインスタンス化を処理する必要があります。self.window.rootViewController
ビューコントローラーを初期化するのではなく、への参照を取得して、ビューコントローラー階層をトラバースします。
したがって、あなたrootViewController
がUINavigationControllerであり、そのトップビューコントローラーに何かを送信したい場合は、AppDelegateで次のように実行しますdidFinishLaunchingWithOptions
。
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
Swiftでは非常に似ています:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
ストーリーボードが読み込まれる通常の方法をバイパスして自分でストーリーボード全体を読み込む場合を除き、アプリのデリゲートからストーリーボードIDを使用してビューコントローラーを初期化しないでください。AppDelegateからシーンを初期化する必要がある場合は、おそらく何かがおかしいでしょう。なんらかの理由で、スタックを介してビューコントローラーにデータを送信したい場合、つまり、AppDelegateがビューコントローラースタックに到達してデータを設定してはいけません。それはそのビジネスではありません。rootViewControllerがビジネスです。rootViewControllerが自身の子を処理するようにします!したがって、info.plistファイル内の参照を削除することにより、システムによる通常のストーリーボードの読み込みプロセスをバイパスする場合は、多くの場合、次を使用してrootViewControllerをインスタンス化します。instantiateViewControllerWithIdentifier:
、UINavigationControllerのようなコンテナの場合は、そのルート。回避したいのは、ストーリーボードによってすでにインスタンス化されているView Controllerをインスタンス化することです。これは私がよく目にする問題です。要するに、私は受け入れられた答えに同意しません。それ以外の場合は2つのストーリーボードをロードするため、ポスターがinfo.plistからストーリーボードのロードを削除することを意味しない限り、これは正しくありません。これは意味がありません。システムはルートシーンを初期化してウィンドウに割り当てたので、メモリリークではない可能性がありますが、その後、インスタンス化して再度割り当てました。あなたのアプリはかなり悪いスタートを切っています!