0

编辑:底部留下一个问题 - 如何确保在导航控制器提供的任何 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];
4

1 回答 1

0

好吧,事实证明这有点棘手,而且没有现成的解决方案。

棘手的原因很简单:因为任何局外人都无法知道您希望您的应用程序状态如何响应打开的 URL,所以没有办法做一个框架。剩下的就是内省、遍历视图层次结构等基本工具。

一个有用的提示:您实际上可以调试在设备上打开 URL 的过程。转到调试配置文件,并将其设置为等待手动启动应用程序。你不能去你的电子邮件或任何地方调用链接,调试器将在你的应用程序启动时启动。

在 XCode 5 中:产品 -> 方案 -> 编辑方案(运行方案)选择启动选项“等待手动启动

于 2013-08-23T05:11:38.300 回答