【问题标题】:How do I ensure that the right ViewController is loaded when accepting a file?如何确保在接受文件时加载正确的 ViewController?
【发布时间】:2013-08-17 09:54:47
【问题描述】:

编辑:底部留下一个问题 - 如何确保在导航控制器提供的任何 VC 正确完成弹出之前我不调用方法。

编辑:An useful tutorial in doing pretty much what I want, but not quite.

所以我有这个设置

初始 VC -> 选项卡控制器 ->(三个 VC,其中一个...)包含文件列表的 NavController -> 文件编辑器

在任何时候,我都可能收到发送给我的应用程序委托的 application:handleOpenUrl 消息,告诉我用户想要编辑文件,例如电子邮件中的附件。根据我的应用程序的状态,可能会加载所有或部分这些 VC。为了对 URL 做出明智的反应,我至少需要加载 NavController。

我想真正的目标是让应用程序处于加载 NavController 的状态以及当前活动的控制器,这样我就可以从 AppDelegate 向它发送一条消息,以便在处理给定文件后加载它。

那么:这里的最佳做法是什么?

编辑

所以我玩了一会儿,走到了这一步:

我知道根 VC 是一个 UITabBarController,并且总是被加载。

我知道我的 NavigationController 位于索引 2

我知道它已经加载了 NC,或者如果我切换到选项卡会按需加载

那么算法是: 抓住根标签栏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];

【问题讨论】:

    标签: ios uiviewcontroller appdelegate uitabcontroller


    【解决方案1】:

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

    这很棘手的原因很简单:由于任何局外人都无法知道您希望应用程序状态如何响应打开的 URL,因此无法构建框架。剩下的是内省、遍历视图层次结构等基本工具。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2019-11-25
      • 2016-12-09
      • 2013-05-19
      • 2021-07-28
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多