我有一个tabBar
。它的每个选项卡ViewControllers
都嵌入到各自的NavigationControllers
中。
层次结构:Tabbarcontroller
--> NavigationController
--> VC 1--> VC 2-->... VCn(对于表1)
当我点击推送通知时,我必须重定向到其中一个视图控制器,比如VC 2。我使用的代码如下。
let navigationController = UINavigationController()
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
if let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as? ChatViewController {
navigationController.viewControllers = [chatViewController]
window?.rootViewController = navigationController
}
通过使用这个,我被重定向到相应的ViewController
。但是,我无法回到tabBar
。那么是否有可能以这样一种方式重定向,它允许我回到标签栏,从而提供与UI中相同的层次结构?
编辑:
下面的图片显示了我的布局。
我想完成以下工作:
1.当用户点击推送通知时,应用应被定向到VC-B。* 如果VC-B已经在导航堆栈的顶部,则不应为VC-B创建新对象并添加到导航堆栈。
1.如果应用程序已终止并且用户点击通知,则应打开VC-B。
为了确定应用程序是否已被终止,我设置了一个标志:
func applicationWillTerminate(_ application: UIApplication) {
UserDefaults.standard.set(true, forKey: UserDefaultsKey.isTerminated)
}
此标志在didFinishLaunchingWithOptions函数结束时设置为false。
对于重定向,我检查此标志以确定应用程序是否已终止:
func performRedirectionToSuitableViewController(userInfo: [AnyHashable: Any]) {
let isTerminated = UserDefaults.standard.object(forKey: UserDefaultsKey.isTerminated) as! Bool
if isTerminated {
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
let tab = storyboard.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
tab.selectedIndex = 0
let nav = tab.viewControllers![0] as! UINavigationController
let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as! ChatViewController
chatViewController.chatThreadId = userInfo["thread_id"] as? String
nav.pushViewController(chatViewController, animated: true)
} else {
if let tab = window?.rootViewController?.presentedViewController as? UITabBarController {
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as! ChatViewController
chatViewController.chatThreadId = userInfo["thread_id"] as? String
if let nav = tab.selectedViewController as? UINavigationController {
nav.pushViewController(chatViewController, animated: true)
}
}
}
}
有了这段代码,我的第一个要求就部分实现了。需要确定viewcontroller是否位于导航堆栈的顶部。
并且,在终止应用的情况下,单击推送通知打开选项卡栏,其中默认选择索引被选择。
我花了几天时间试图解决这个问题。但却不能让它工作。
5条答案
按热度按时间2g32fytz1#
我想你必须做这样的事情:
o4tp2gmn2#
好吧,你正在设置当前的
window.rootViewController
,这应该是我说的TabBarViewController
。这就是为什么你不能回到TabBar
你应该做的是
iovurdzv3#
从选项卡栏控制器中获取当前的导航控制器。您可以使用此功能
使用该函数,您可以像下面这样导航视图控制器。
jdzmm42g4#
您可以在RootViewController中创建一个方法,在收到推送通知后将用户重定向到特定视图。这是我在上一个项目中所做的。
然后你可以像这样在AppDelegate上调用这个方法:
eqzww0vc5#