如何确保在接受文件时加载正确的 ViewController?

Posted

技术标签:

【中文标题】如何确保在接受文件时加载正确的 ViewController?【英文标题】:How do I ensure that the right ViewController is loaded when accepting a file? 【发布时间】: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];

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何确保在接受文件时加载正确的 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 文件如何正确存储图像和图像压缩

java应用程序错误无法启动该应用程序无法加载资源

AH00136:服务器必须在接受连接之前放弃启动权限。请确保已加载 mod_unixd 或其他系统安全模块

在进行滚动部署时,如何确保 Cloudfront 具有正确的资产版本?

如何将压缩包加载到猪

解答如何保障ETL过程的数据正确性。这个过程会产生哪些问题?