通过 appDelegate openURL 函数呈现 viewController(在导航层次结构中)

Posted

技术标签:

【中文标题】通过 appDelegate openURL 函数呈现 viewController(在导航层次结构中)【英文标题】:Presenting viewController (within Navigation hierarchy) via appDelegate openURL function 【发布时间】:2015-09-07 23:42:50 【问题描述】:

我的初始视图控制器是一个登录页面,它检查当前用户是否已登录。如果是,则对下一个视图执行转场,即标签栏控制器,其默认选择的标签是表格视图(已嵌入导航控制器中)。

在这个表视图中是一个事件对象列表。当用户选择一个事件对象时,事件详细信息显示在一个新视图中,并且导航栏出现在上方,允许用户返回到他们的事件列表。这一切正常。

但是,应用程序有一个 URL 方案,允许它通过 URL 启动。在我的应用程序 Delegate 中,我能够捕获我需要的 URL 方案和查询。

我的问题是当我尝试展示必要的视图控制器时。我实际上能够呈现视图控制器(它是一个事件详细信息视图控制器),但是这个视图控制器不在我需要的导航层次结构中。无法弄清楚如何做到这一点(下面的代码再次在 appDelegate 的 openURL 函数中,通过我的自定义 URL 方案调用):

        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        //the viewController to present
        let viewController = storyboard.instantiateViewControllerWithIdentifier("SingleEventAfterCreationViewController") as! SingleEventAfterCreationViewController

        let eventListNavController = storyboard.instantiateViewControllerWithIdentifier("EventsListNavigationController") as! UINavigationController

//set a bunch of properties on my viewController

//below is where I'm unsure. The correct view controller is presented, but the navigation bar above, and tab bar below is lost. Subsequently, when I click on a "user" of the event, the program crashes, I'm guessing because there is no navigation hierarchy. 

self.window?.rootViewController = eventListNavController

                self.window?.rootViewController?.presentViewController(viewController, animated: true, completion: nil)

崩溃文本:

由于未捕获的异常“NSGenericException”而终止应用程序,原因:“找不到用于 segue 'showProfileSegue' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。'

我附上了我的故事板的图像来帮助说明我的问题,以及通过 URL 打开应用程序时现在发生的情况的图像,以及该视图中的哪些操作会导致它崩溃。我还附上了所呈现的视图控制器应该是什么样子的图像。

故事板全屏:https://s3.postimg.org/oywzb595f/storyboard_help.png

我的故事板:

问题:

它应该是什么样子:

【问题讨论】:

【参考方案1】:

我想通了。

最初,我在我的 Storyboard 中设置了我的 Initial View Controller,但我已将其删除。我现在在 AppDelegate 的 didFinishLoadingWithOptions 函数中以编程方式设置它。

接下来,在我的应用委托函数中,我这样做了:

let rootTabBarController = self.window?.rootViewController as! UITabBarController

let firstNavigationController = storyboard.instantiateViewControllerWithIdentifier("EventsListNavigationController") as! UINavigationController

rootTabBarController.viewControllers![0] = firstNavigationController

//the viewController to present
let viewController = storyboard.instantiateViewControllerWithIdentifier("SingleEventAfterCreationViewController") as! SingleEventAfterCreationViewController

//set variables in viewController

firstNavigationController.pushViewController(viewController, animated: true)

当用户尚未登录应用程序时,我可能会遇到问题(由于我通过 AppDelegate 设置的初始 viewController),但我的基本问题已经解决。

【讨论】:

谢谢!我的故事板和你的差不多,这也正是我想做的。在我遇到你的问题之前一直在浪费过去几个小时。感谢分享答案。 @Isuru 很棒,很高兴它有帮助 太棒了...你刚刚救了我。 @NileshKumar 甜??

以上是关于通过 appDelegate openURL 函数呈现 viewController(在导航层次结构中)的主要内容,如果未能解决你的问题,请参考以下文章

iOS AppDelegate.m:处理 openUrl RCTLinkingManager 和 Twitter - 方法 'application:openURL:options:' 的重复声明

UIApplication sharedApplication openURL

APPDelegate 中的 openURL 转换错误 NSString -> String (Swift & iOS8)

聊聊AppDelegate解耦

Swift 中的应用程序 openURL

什么是注释:openURL 方法中的(id)注释?