NavigationControllers 和 UITabBar

Posted

技术标签:

【中文标题】NavigationControllers 和 UITabBar【英文标题】:NavigationControllers and UITabBar 【发布时间】:2012-02-26 12:17:39 【问题描述】:

我的应用程序是这样的:应用程序委托中的导航栏有一个像 rootController 一样的 Controller1(UIViewController),在控制器 1 中我推送控制器 2(UIViewController),控制器 2 有 3 个 UINavigationController 和一个自定义 tabBar,每个导航控制器有一个根控制器,最后我把所有的navigationController 放在CustomTabBar 中。

我的问题是:这样做干净(好)吗?如果没有,我该如何组织我的项目?

MyAppDelegate.h 
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navigationController;
@property (strong, nonatomic) CustomTabBar *tabBarController;

MyAppDelegate.m 
UIViewController *controller1 = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    navigationController = [[UINavigationController alloc] initWithRootViewController:controller1];
 self.window.rootViewController = navigationController;


controller1.h
    UIViewController controller2;
    UINavigationController *navigationController2;

    UIViewController controller3;
    UINavigationController *navigationController3;


    UIViewController controller3;
    UINavigationController *navigationController3;

controller1.m 
-(void)viewDidLoad

viewController1 = [[UIViewController......
navigationController1 = [[UINavigationController alloc] initWithRootViewController:controller1];
....

AppDelegate *apDelegate= [UIApplication sharedApplication].delegate;

    apDelegate.tabBarController = [[CustomTabBar alloc] initWithNibName:nil bundle:nil];
   [apDelegate.tabBarController setViewControllers: [NSArray arrayWithObjects:navigationController1,navigationController2,navigationController3,nil]];

【问题讨论】:

尝试更好地解释您的问题并将您的代码划分为功能单元。很难阅读。谢谢。 我不确定你想做什么。你想让控制器1在tab1中,controller2在tab2中,controller3在tab3中吗? 是的,我想要这个 对不起,我英语不好 【参考方案1】:

这是摘自苹果documentation:

部署标签栏界面时,您必须将此视图安装为窗口的根目录。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。

在我看来,从一开始就理清如何使用 UITabBarController 类有点棘手,所以在这种情况下,更好的方法是看一些好的手册。对我来说,this one 在我开始搞乱这个 UI 的时候总是有帮助的 :)

祝你好运。

编辑: 为了让你的标签栏只出现在一些具体的视图中,你必须从应用程序的开始隐藏你的标签栏,并让它只在你真正需要的时候出现。 为了隐藏它,你可以使用方法:

[theTabBar setHidden:YES];

【讨论】:

谢谢,这意味着我不能这样做:[self.view addSubview:apDelegate.tabBarController.view]; 完全正确。如果我没记错的话,您的标签栏应该在 Window 对象的应用程序委托中。花这 20 分钟观看我提供链接的视频,我想你不会后悔的。 但我不希望我的 TabBar 出现在第一个控制器中,我不会在我推动 viewContproller1 时出现它,我会观看视频 是的,一旦我也有同样的任务。而你可以做到这一点。你只需要根据苹果的规则从一开始就隐藏标签栏。 要隐藏标签栏,你可以在这里***.com/questions/2257178/…【参考方案2】:

将tabBarController设置为window对象的rootViewController:

self.window.rootViewController = tabBarController;

或者您可以将 tabBarController.view 设置为窗口对象的子视图:

[self.window addSubView:tabBarController.view];

【讨论】:

感谢您的回答,但我不希望我的标签栏出现在第一个视图中,我希望它出现在第二个视图中,我该怎么做? 请看看我的最后一条评论——我有同样的任务,它被认为是按照那里建议的方式实现的。您必须从应用程序开始时从屏幕上删除标签栏。这是苹果选择的一种方法 - 不是某种丑陋的方法。【参考方案3】:

如果你想将 tabBarController 添加到第二个视图:

[secondViewController.view addSubView:tabBarController.view];

或者,对于导航控制器

[navigationController1.view addSubView:tabBarController.view];
or
navigationController1.rootViewController = tabBarController;

换句话说,在controller1.m 中声明一个TabBarController 并添加navController1、navController2 等。

然后将 tabBarController 作为 rootViewController 或 subView 添加到 controller1。

我希望这就是你要找的!

【讨论】:

以上是关于NavigationControllers 和 UITabBar的主要内容,如果未能解决你的问题,请参考以下文章

UITabBarController 视图之间的共享控件

更改选项卡时忽略自动旋转

不同 UINavigationController 中的不同外观

iOS6 中奇怪的 SplitView/NavigationController 行为

preferredStatusBarStyle 的奇怪行为

在 segue 中停用推送动画