編集: 一番下に 1 つの質問が残っています - ナビゲーション コントローラーによって提示された VC が適切にポップされる前に、メソッドを呼び出さないようにする方法。
編集:私がやりたいことをほとんど行うための便利なチュートリアルですが、完全ではありません。
だから私はこのセットアップを持っています
最初の VC -> タブ コントローラー -> (3 つの VC、そのうちの 1 つ...) ファイル リストを含む NavController -> ファイル エディター
いつでも、アプリケーション デリゲートに送信された application:handleOpenUrl メッセージを受け取る可能性があります。このメッセージは、ユーザーがファイル (たとえば、電子メールの添付ファイル) を編集したいことを示しています。アプリの状態によっては、これらの VC のすべてまたは一部が読み込まれている可能性があります。URL に適切に反応するには、少なくとも NavController をロードする必要があります。
本当の目的は、NavController が読み込まれた状態でアプリを取得し、現在アクティブなコントローラーを取得することだと思います。そのため、AppDelegate からメッセージを送信して、処理された特定のファイルを読み込むことができます。
だから:ここでのベストプラクティスは何ですか?
編集
だから私は少し遊んで、ここまで行きました:
ルート VC が UITabBarController であり、常に読み込まれていることはわかっています。
私のNavigationControllerがインデックス2であることを知っています
NC がロードされているか、タブに切り替えるとオンデマンドでロードされることを知っています。
したがって、アルゴリズムは次のとおりです。ルートのタブバー VC を取得します。まだタブ 2 に切り替えていない場合は、タブ 2 に切り替えるように指示します。タブ 2 で NavigationController を取得します。root にポップして、何をすべきかを伝えます。
私の唯一の問題は、このコードでは、NC によって現在提示されている VC が viewWillDisappear を行うように変更される前に、Navigation コントローラーのルート VC で呼び出すアクションが実行されることです。
UITabBarController *root = (UITabBarController*) self.window.rootViewController;
if (root.selectedIndex != 2) {
root.selectedIndex = 2;
};
UINavigationController *nc = root.viewControllers[2];
[nc popToRootViewControllerAnimated:YES];
NSObject<SGPTFileManagerViewProtocol> *fileManager = (NSObject<SGPTFileManagerViewProtocol> *) nc.visibleViewController;
// Whoops! This method is invoked before the navigation controller is done popping a presented view controller!
[fileManager METHOD-FOR-HANDLING-THE-URL-HERE];