0

編集: 一番下に 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];
4

1 に答える 1