如何在 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 并在对话框中间显示选项卡