首页 > 解决方案 > 如何从 TabBar 到达 NavigationController 上的 rootViewController?

问题描述

我正在编写一个聊天应用程序。我想在后台获取我的消息。它将是连续的。这就是我将使用performFetchWithCompletionHandler的原因(如果你知道更好的方法,你可以提供给我)。我的rootViewControllertabBar。但是我必须将此代码用于其他控制器,并且我无法从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)这样的原因。其实我不想那样。 谢谢你。

标签: swift

解决方案


您需要访问应用程序的共享窗口:

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")
    }

}

推荐阅读