如何在 App Delegate 中将选项卡控制器设置为根控制器而不实例化(重新加载)它?

Posted

技术标签:

【中文标题】如何在 App Delegate 中将选项卡控制器设置为根控制器而不实例化(重新加载)它?【英文标题】:How can I set tab controller as root controller in App Delegate without instantiate (reloading) it? 【发布时间】:2017-07-19 15:07:22 【问题描述】:

我在我的应用 (firebase) 中发送通知,因此在 didReceiveRemoteNotification 中,我将用户引导到应用中的新位置(导航控制器之一中的视图控制器,位于选项卡控制器内部)。

在我的选项卡控制器的第一个视图中,如果用户已经通过位置服务和推送通知视图控制器(这是他们接受或拒绝权限的地方),它总是检查 UserDefaults。如果用户没有使用过这些视图控制器(比如他们第一次启动应用程序),它将转到适当的视图控制器(图像中的 segue 1 和 2)。问题是,当它转到位置服务或推送通知视图控制器时,我的 didReceiveRemoteNotification 中的选项卡栏控制器引用似乎不起作用。这意味着当我按下通知时,如果用户在位置服务或推送通知中,它不会正确导航选项卡控制器。如果用户不必通过定位服务或推送通知,它确实有效。这就是为什么我认为如果用户通过它,根控制器出于某种原因会切换到其中之一。

简单明了,我只希望我的标签栏控制器引用在我的 AppDelegate 中工作。为什么只有当用户通过定位服务或推送通知时它才不起作用?这是我的代码:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
    let state = UIApplication.shared.applicationState
    if(state == .active) 
        // Create local notification
     else 
        if let businessID = userInfo["business_id"] as? String 
            Globals.notificationBusinessId = Int(businessID)!
        
        if let businessName = userInfo["business_name"] as? String 
            Globals.notificationBusinessName = "\(businessName)"
        
        if let itemID = userInfo["item_id"] as? String 
            Globals.notificationItemID = Int(itemID)!
        
        if let navigationLevel = userInfo["navigation_level"] as? String 
            Globals.notificationNavigationLevel = Int(navigationLevel)!
        
        Globals.popToBusinessesController = true

        myTabBar.selectedIndex = 1
        myTabBar.selectedIndex = 2
    

【问题讨论】:

【参考方案1】:

如果您点击通知didReceiveRemoteNotification 将不会被调用,仅当您在应用程序处于活动状态时收到通知时才会调用。 如果远程通知到达时应用程序未运行,则该方法将启动应用程序并在启动选项字典中提供适当的信息。

您可以查看所有here

【讨论】:

是的,这部分对我有用。当应用程序关闭时按下通知时,它会打开应用程序并导航到正确的屏幕。问题是在应用程序中,当用户通过定位服务或推送通知时,它会弄乱标签栏控制器的引用。所以在这种情况下,当用户按下通知时,它什么也不做。但是,如果用户没有通过定位服务和推送通知,标签栏控制器似乎按预期工作! 我只是很困惑,为什么当应用程序首次启动时向用户显示位置服务或推送通知时,通知不起作用。但在其他任何时候,他们都会这样做。不工作是指标签栏导航不正确。它始终按预期进入 didReceiveRemoteNotification。 嗯,代码里写着if(state == .active)...,那么如果用户在应用程序中,什么都不会发生。 即使应用程序在后台,它也不起作用。我确认它在标签栏控制器调用之前就开始了,但它不起作用。它仅在用户未通过定位服务或推送通知视图控制器(例如在应用程序的第二次启动时)时才有效。 我想我明白了。似乎是segues搞砸了。通过切换到present 和dismiss 而不是segues,它似乎按预期工作。

以上是关于如何在 App Delegate 中将选项卡控制器设置为根控制器而不实例化(重新加载)它?的主要内容,如果未能解决你的问题,请参考以下文章

无法在测试中将 App Delegate 强制转换为 App Delegate

在 Facebook 应用程序选项卡中将值传递给 iframe

如何在基于 mfc 对话框的应用程序中将选项卡添加到 tabcontrol 并在对话框中间显示选项卡

我们如何在反应原生版本 .61 中将动画添加到底部选项卡图标

如何在 ESLint 中将选项卡大小定义为 4?

如何在 gnome-terminal 中将选项卡显示为 4 个空格