绝大部分软件都采用了UITabBarController
+UINavigationController
的设计模式,这是一种很主流很经典的设计方式,而另外一种UINavigationController+
UITabBarController也是一种非常灵活的模式
方式一:TabBarController的viewControllers + 一个NavigationController
创建过程大概如下(关键代码):
AppDelegate.m
TabBarController *tabVC = [[TabBarController alloc]init];
方式二:TabBarController的viewControllers + 多个NavigationController
创建过程大概如下(关键代码):
AppDelegate.m
TabBarController *tabVC = [[TabBarController alloc]init];
self.window.rootViewController = tabVC;
TabBarController.m - (void)viewDidLoad { [super viewDidLoad]; [self addChildVc:[[ChatViewController alloc] init] title:@"Chat" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"]; [self addChildVc:[[ContactsListViewController alloc] init] title:@"Contact" image:@"tabbar_contacts" selectedImage:@"tabbar_contacts_selected"]; [self addChildVc:[[MoreViewController alloc] init] title:@"More" image:@"tabbar_more" selectedImage:@"tabbar_more_selected"]; [self addChildVc:[[ProfileViewController alloc] init] title:@"Profile" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"]; } - (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage { childVc.title = title; childVc.tabBarItem.image = [UIImage imageNamed:image]; childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
对比分析
第一种方式:
导航控制器上的title
不能和tabbar
上面的同步,需要手动单独设置,比如可以在控制器的viewWillAppear:
方法里面设置.
navigationItem
的左右按钮和颜色可能各不相相同,也需要在viewWillAppear:
里切换设置.可能后续的界面跳转也需要在此方法里面设置.
第二种方式:
tabbar
上的标题默认会直接同步到导航控制器上.
每个界面都有自己的导航控制器, 界面跳转都有自己的栈, 可能会更加灵活.