从 UITabBarController 和 UINavigationController 访问 UIViewController

Posted

技术标签:

【中文标题】从 UITabBarController 和 UINavigationController 访问 UIViewController【英文标题】:Access UIViewController from UITabBarController and UINavigationController 【发布时间】:2016-12-13 14:28:03 【问题描述】:

我正在开发一个基于UITabbar和视图层次结构的应用程序如下。

UITabBarController ----> UINavigationController ----> UIViewController

我有将打开特定 UIViewController 的推送通知有效负载,我可以使用视图控制器 Storyboard ID 直接显式打开 UIViewController,但不会显示 tabBar 和 Navbar。 如何从 AppDelegate didReceiveRemoteNotifications 转到特定的 View Controller 并显示 TabBar 和 NavController。

谢谢!

【问题讨论】:

你能检查我的答案吗? 当然,我还有几个问题要问你@FedericoMalagoni 【参考方案1】:

你必须实例化你所有的 VC 并将它们全部设置为他的前任的根:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YourVC_Identifier");
    let yourNavController = mainStoryboard.instantiateViewControllerWithIdentifier("YourNAV_Identifier") as! UINavigationController
    let yourTabController = mainStoryboard.instantiateViewControllerWithIdentifier("YourTAB_Identifier") as! UITabBarController

    yourNavController.setViewControllers([yourVC], animated: false)
    yourTabController.setViewControllers([yourNavController], animated: false)


    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window?.rootViewController = yourTabController
    self.window?.makeKeyAndVisible()



    return true

【讨论】:

嗨@Federico Malagoni,你的回答太棒了,代码像我预期的那样工作,但在VC启动后我似乎无法使用popToRootViewController。这是为什么呢? 我不明白你的问题。你能创建新问题吗?【参考方案2】:

[[UIApplication sharedApplication] keyWindow] 有一个属性.rootViewController。大概就是你的标签栏。在此控制器上,您可以设置活动选项卡并使用 .viewControllers 属性切换视图控制器。现在假设其中之一是你的UINavigationController,它也应该有一个属性.rootViewController。从情节提要实例化并设置根或将视图控制器推送到导航控制器的顶部。

【讨论】:

你能用swift显示伪代码吗?谢谢【参考方案3】:

以编程方式遵循 App Delegate 的层次结构。 如果您的入口点来自故事板,请在您的AppDelegate 中设置一个UIWindow,以便您可以将UITabBarController 设置如下。

//self.tabBarController is you TabBar from Storyboard, or programatically initialized
self.window.rootViewController = self.tabBarController; 

然后,每当您在didReceiveRemoteNotifications 中收到通知时,按类型对通知进行排序,然后找到视图控制器:

//Let's say the View Controller being accessed is in the first position of the stack of viewcontroller from UITabBarController & UINavigationController 
UINavigationController *navViewController = self.tabBarController.viewControllers.firstObject;
UIViewController *accessedViewController = navViewController.viewcontroller.firstObject;

【讨论】:

以上是关于从 UITabBarController 和 UINavigationController 访问 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UI篇—UITabBarController简单介绍

如何在具有自定义选项卡 UI(不使用选项卡栏)的 UITabBarController 中删除“更多”选项卡

如何更新 UITabbarController 中的默认徽章 UI 外观?

iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)

从UITabBarController内部呈现UINavigationController

UI基础 - UITabBarController