编辑:底部还有一个问题 - 如何确保在导航控制器提供的任何VC被正确弹出之前不调用方法。
编辑:An useful tutorial in doing pretty much what I want, but not quite.
所以我有这个设置
初始VC - >标签控制器 - > (三个VC,其中一个......)NavController包含文件列表 - >文件编辑器
在任何时候,我都可能会收到一个应用程序:handleOpenUrl消息,发送给我的app委托,告诉我用户想要编辑文件,例如电子邮件中的附件。根据我的应用程序的状态,可能会加载所有或部分VC。为了对URL做出明智的反应,我至少需要加载NavController。
我认为真正的目标是让应用程序处于加载NavController的状态,以及当前活动的控制器,因此我可以从AppDelegate发送一条消息,以便在处理后加载给定文件。
那么:这里的最佳做法是什么?
修改
所以我玩了一下,并且走得很远:
我知道根VC是一个UITabBarController,并且总是被加载。
我知道我的NavigationController在索引2
我知道它已经加载了NC,或者如果我切换到标签
将按需这样做那么算法就是: 抓住根tabbar VC。如果不存在,请告诉它切换到标签2。在选项卡2中抓取NavigationController。将其弹出到root,并告诉它该做什么。
现在我唯一的问题是,在此代码中,我在导航控制器的根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];
答案 0 :(得分:0)
嗯,事实证明它有点棘手,并且没有机架解决方案。
它很棘手的原因很简单:由于任何局外人都无法知道您希望应用状态如何响应打开的URL,因此无法构建框架。您将获得内省的基本工具,遍历视图层次结构等。
一个有用的提示:您实际上可以调试在设备上打开URL的过程。转到调试配置文件,并将其设置为等待手动启动应用程序。您无法转到您的电子邮件或任何内容并调用该链接,调试器将在您的应用启动时启动。
在XCode 5中:产品 - &gt;方案 - &gt;编辑方案(运行方案)选择启动选项“等待手动启动