swift - 如何从 TabBar 到达 NavigationController 上的 rootViewController?
问题描述
我正在编写一个聊天应用程序。我想在后台获取我的消息。它将是连续的。这就是我将使用performFetchWithCompletionHandler的原因(如果你知道更好的方法,你可以提供给我)。我的rootViewController是tabBar。但是我必须将此代码用于其他控制器,并且我无法从AppDelegate访问该控制器。
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let tabbarController = window?.rootViewController as? CustomTabBarController{
if let postController = tabbarController.navigationController?.viewControllers.first as? PostsController{
print("itsWorking")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
//This is my rootViewController
let layout = UICollectionViewFlowLayout()
let postsController = PostsController(collectionViewLayout: layout)
let gezginController = GezginController(collectionViewLayout: layout)
let homeNavController = UINavigationController(rootViewController: postsController)
homeNavController.tabBarItem.title = "Home"
homeNavController.tabBarItem.image = UIImage(named: "home")
navigationController?.pushViewController(gezginController, animated: true)
gezginController.tabBarItem.title = "Gezgin"
gezginController.tabBarItem.image = UIImage(named: "rocket")
viewControllers = [homeNavController,gezginController]
}
我想从AppDelegate到达PostController。但是您必须知道PostController是 CollectionView 并且我为此使用了布局。这就是为什么我不能在AppDelegate上使用像PostController (layout: layout)这样的原因。其实我不想那样。
谢谢你。
解决方案
您需要访问应用程序的共享窗口:
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let tabbarController = UIApplication.shared.keyWindow?.rootViewController as? CustomTabBarController,
let postController = tabbarController.navigationController?.viewControllers.first as? PostsController {
print("great success")
}
}
推荐阅读
- node.js - 如何在 ubuntu 上使用 express static 将 html 文件带入我的 nodejs 文件?
- javascript - Ag-Grid 为单个 rowNode 启用复选框选择
- javascript - 如何在 Ionic 中将画布保存为 jpg?
- openssl - BIO_meth_new + BIO_get_new_index 的正确用法是什么?
- sql - Redshift - 过去一小时的值的窗口函数
- python - 为什么这个while循环结束?node5 不是 NoneType。(遍历链表)
- hive - 在 HIVE 中插入当前时间戳作为多行插入的一部分
- merge - SSIS - 加入来自不同服务器的两个不同表
- wordpress - Laravel 使用 wordpress 博客从公共文件夹中安装
- batch-file - 在批处理文件中拖放-扩展此代码问题的变量