从 appDelegate 转到视图控制器

Posted

技术标签:

【中文标题】从 appDelegate 转到视图控制器【英文标题】:Segue to a view controller from appDelegate 【发布时间】:2015-09-01 11:12:05 【问题描述】:

我有一个应用程序设置为接收推送通知。当用户收到通知时,我的 appDelegate 中有一个回调。如果应用程序处于非活动状态并且用户单击设备面板上的通知,我需要能够从这里开始。

应用程序的流程是一个登录视图控制器(如果 loginBool 为真,则跳过该控制器),它导致一个选项卡控制器。在选项卡控制器上,我有 3 个位置可以使用 id 为“FeedDetailedController”的同一 viewController。

这是我需要转入并传入我在通知中收到的变量的 FeedDetailedController。这个控制器可以从 3 个不同的地方访问,其中 2 个是带有表格视图的选项卡,当您单击一行时,它会传入一个变量并执行一个 segue。我需要从我的应用委托中模拟这个,即从通知中传递数据,就像我对行所做的那样。

目前的尝试:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
        println("received a notification")
        PFPush.handlePush(userInfo)
        if application.applicationState == UIApplicationState.Inactive 
            println("in the notification if with \(userInfo)")

            if let info = userInfo["custom"] as? Dictionary<String, AnyObject>  
                if  let reportId = info["reportId"] as? String 
                    println("\nFrom APS-dictionary with key \"type\":  \(reportId)")
                    //pass in reportId to the viewcontroller somehow

                    let storyboard = UIStoryboard(name: "Main", bundle: nil)
                    let vc = storyboard.instantiateViewControllerWithIdentifier("NewFeedDetailedController") as! UIViewController

                    let navigationController = UINavigationController(rootViewController: vc)
                    self.window?.rootViewController?.presentViewController(navigationController, animated: true, completion: nil)
                

            
            PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
        
        else
            println("in the notification else")
            //this is when the app is active, do I need to detect which view   controller I am currently on before I can seg???
        
    

当前代码给出以下信息:

Warning: Attempt to present <UINavigationController: 0x12ed763d0> on <UINavigationController: 0x12ed11ce0> whose view is not in the window hierarchy!

这是有道理的,但我不知道我应该如何从 appDelegate 代码中获得正确的层次结构

【问题讨论】:

【参考方案1】:

是否可以在应用的初始视图控制器中检查该通知?就像将通知作为布尔值传递?您可以查看 viewWillAppear: 之类的地方并检查它 - 如果它在那里控制该视图的 segue,而不是尝试在 appDelegate 本身中执行它?

那样它看起来会直接进入新视图,但实际上是通过已加载层次结构的视图控制器?

【讨论】:

好吧,我不能将 didReceiveRemoteNotification 函数移动到视图控制器中。如果您要在应用程序委托中设置 NSUserDefault Bool ,然后在收到通知时检查 loginviewController 并判断标志是否设置为 true,这可能会变得复杂,因为我已经有一个 loginBool 可以跳过该屏幕,如果用户登录,我触发标签栏的打开。但是从通知移动到我想要的控制器需要打开标签栏,然后转到我的 feedDetailedController? 我可以在这里看到复杂性的危险,因为您有逻辑可以绕过基于该布尔值的初始视图。我不确定是否需要打开标签栏来执行您需要做的事情。我本质上是建议使用通知设置的全局变量来告诉您在视图控制器中需要知道的内容,然后触发 segue。从您所说的看来,由于您的登录逻辑,您必须在两个控制器中检查它......所以由于您对复杂性的担忧,我不确定它是否是“最佳”答案(正确的是)。 如果我将我的检查放入我的每个选项卡中的 viewDidAppear 并从那里执行 seg 并重置布尔值会怎样?为了解释更多,我的应用中有 5 个标签。选项卡 3 有一个表格视图,当单击它时会转到前面描述的 feedDetailedController。如果应用程序在后台并且重新打开时位于选项卡 2 上,我会在 viewDidAppear 中检查 notificationbool 并以编程方式转到 feedDetailedController。那么当用户按下返回时,他们只是返回到标签二吗?或者我是否必须“保留标签”以了解发生转场的位置并以编程方式转回该屏幕?

以上是关于从 appDelegate 转到视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器

从 appdelegate 展示一个视图控制器

我应该将 appDelegate 用于所有单例样式的应用程序级代码吗?

向 AppDelegate 添加协议未注册

使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器

目前从 Appdelegate 快速转到 UITabBarController