Suj*_*jal 5 uitabbarcontroller uinavigationcontroller push-notification ios swift
我有一个tabBar. 它的每个选项卡ViewControllers都嵌入在各自的NavigationControllers.
等级制度:
Tabbarcontroller--> NavigationController--> VC1 --> VC2 -->...VCn(对于tab1)
当我单击推送通知时,我必须重定向到其中一个视图控制器说 VC2。我使用的代码如下。
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
}
Run Code Online (Sandbox Code Playgroud)
通过使用它,我被重定向到相应的ViewController. 但是,我无法回到tabBar. 那么是否有可能以允许我返回标签栏的方式重定向,从而提供与 UI 中相同的层次结构?
编辑:
下图显示了我的布局。
我想完成以下工作:
当用户点击推送通知时,应用程序应被定向到 VC-B。*如果 VC-B 已经在导航堆栈的顶部,它不应该为 VC-B 创建新对象并添加到导航堆栈。
如果应用程序已终止并且用户点击通知,则应打开 VC-B。
为了确定应用程序是否已终止,我设置了一个标志:
func applicationWillTerminate(_ application: UIApplication) {
UserDefaults.standard.set(true, forKey: UserDefaultsKey.isTerminated)
}
Run Code Online (Sandbox Code Playgroud)
该标志在 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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我的第一个要求部分满足。需要确定视图控制器是否位于导航堆栈的顶部。
并且,在应用终止的情况下,单击推送通知会打开标签栏,并选择默认选择索引。
我花了几天时间试图解决这个问题。但不能让它工作。
小智 0
好吧,你正在设置 current window.rootViewController,这应该是TabBarViewController我想说的。这就是为什么你无法回到TabBar
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
if let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as? ChatViewController, let tabBar = storyboard.instantiateViewController(withIdentifier: "tabBar") as? UITabBarController {
let navigationController = UINavigationController(rootViewController: chatViewController)
navigationController.viewControllers = [chatViewController]
tabBar.viewControllers = [navigationController]
window?.rootViewController = tabBar
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3236 次 |
| 最近记录: |