编辑:底部留下一个问题 - 如何确保在导航控制器提供的任何 VC 正确完成弹出之前我不调用方法。
所以我有这个设置
初始 VC -> 选项卡控制器 ->(三个 VC,其中一个...)包含文件列表的导航控制器 -> 文件编辑器
在任何时候,我都可能收到一条 application:handleOpenUrl 消息发送给我的应用程序委托,告诉我用户想要编辑一个文件,例如来自电子邮件的附件。根据我的应用程序的状态,可能会加载所有或部分这些 VC。为了对 URL 做出明智的反应,我至少需要加载 NavController。
我想真正的目标是让应用程序处于加载 NavController 和当前活动控制器的状态,因此我可以从 AppDelegate 向它发送一条消息,以便在处理给定文件后加载它。
那么:这里的最佳实践是什么?
编辑
所以我玩了一会儿,并做到了这一点:
我知道根 VC 是一个 UITabBarController,并且总是被加载。
我知道我的 NavigationController 位于索引 2
我知道它要么已经加载了 NC,要么如果我切换到选项卡会按需加载
所以算法是:抓取根标签栏VC。如果还没有,告诉它切换到选项卡 2。在选项卡 2 中获取 NavigationController。将其弹出到根目录,并告诉它要做什么。
现在我唯一的问题是,在这段代码中,我在导航控制器的根 VC 上调用的操作是在 NC 当前提供的任何 VC 更改为 viewWillDisappear 之前执行的。
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];