原文地址:http://blog.sina.com.cn/s/blog_9564cb6e0101wjoe.html
UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器,它们都属于UIViewController的子类,继承关系如下:
- @interface
UITabBarController : UIViewController
- @interface
UINavigationController : UIViewController -
UINavigationController:同级页面之间的跳转,界面典型的特点就是页面上部有一UINavigationBar导航条,导航条可以设置标题、左上角的按钮(一般用于返回),右上角的按钮,也可以自定义这些元素。
UITabBarController:父子页面之间的嵌套关系,界面典型的特点是耍耍下部有一UITabBar选项组,通过点击Tab,可切换上面的视图的变换。
UIViewController、UINavigationController、UITabBarController三者的整合使用,可以开发出大部分的App应用页面框架。
一、在我们项目AppDelegate中添加UIViewController
- //把UIViewController添加的应用中:
- -
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOp tions:(NSDictionary *)launchOptions - {
-
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; -
-
SplashViewController *splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashViewController" bundle:nil]; -
self.window.rootViewController = splashViewController; -
-
self.window.backgroundColor = [UIColor whiteColor]; -
[self.window makeKeyAndVisible]; -
return YES; - }
上面说过,UINavigationController与UITabBarController是UIViewController的子类,所以,也可以按这样的方式添加,主要看项目界面的需要。
二、UIViewController之间的跳转与传参
一般的应用程序都不会只有一个页面,而页面之间的跳转,可以这样调用:
- //从UIViewController跳转到另一个UIViewController
- LoginViewController
*loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; - [self
presentViewController:loginViewController animated:true completion:^{}]; - //从UIViewController返回上一个UIViewController
- [self
dismissViewControllerAni mated:true completion:^{}];
很多从Android开发转过来的同事,都会问一个问题:两个页面之间怎么传递参数?
其实,Android通过Intent对象来跳转和传递参数,当前页面是拿不到下一个页面的实例;而在iOS中,我们是通过直接创建的方式创建下一个页面实例的,所以,你可以在下一个UIViewController实例中提供一个方法,供当前页面去给它设置参数就行。
在Android中,返回上一个页面,还是通过Intent来回传参数;而在iOS中,可通过设置代理的方式来传参。具体使用下面的例子中会看到。
三、由UIViewController跳转到UITabBarController
- //从UIViewController跳转到UINavigationController
- HomeViewController
*homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; - UINavigationController
*navigationController = [[UINavigationController alloc] initWithRootViewControll er:homeViewController]; - [self
presentViewController:navigationController animated:true completion:^{}];
HomeViewController是一个UITabBarController子类,代码如下:
- //HomeViewController是一个UITabBarController子类
- @interface
HomeViewController : UITabBarController - @end
四、UITabBarController嵌套子页面
在本例中,这个UITabBarController还属于UINavigationController导航链中的一个环节,故可以调用导航控制器相应的方法。
UITabBarController本身可以嵌套多个子页面的,每个页面可以由一个UIViewController来提供。代码如下:
- -
(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - {
-
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; -
if (self) { -
//设置导航标题 -
self.title = @"Message"; -
//设置导航左上角的按钮 -
UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlai n target:self action:@selector(onLeftBtnClick:)]; -
self.navigationItem.leftBarButtonItem = leftBtn; -
//设置导航右上角的按钮 -
UIImage *img = [UIImage imageNamed:@"msgIcon"]; -
UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStyleBord ered target:self action:nil]; -
self.navigationItem.rightBarButtonItem = rightBtn; -
-
//新建Tab页面 -
UserListViewController *userListViewController = [[UserListViewController alloc] initWithNibName:@"UserListViewController" bundle:nil]; -
MessageListViewControlle r *messageListViewControlle r = [[MessageListViewControlle r alloc] initWithNibName:@"MessageListViewControlle r" bundle:nil]; -
//添加Tab耍耍到Tab控制器 -
self.viewControllers = @[messageListViewControlle r, userListViewController]; -
//设置UITabBarControllerDelega te代理 -
self.delegate = self; -
} -
return self; - }
五、UITabBarController子页面之间的切换
HomeViewController实现了UITabBarControllerDelega
te协议,可用于Tab切换时执行某此操作,如下: - //实现协议方法,用于切换Tab时,更改页面的标题
- -(void)tabBarController:(UITabBarController
*)tabBarController didSelectViewController:(UIViewController *)viewController { -
NSInteger index = tabBarController.selectedIndex; -
NSString *title; -
switch (index) { -
case 0: -
title = @"Message"; -
break; -
case 1: -
title = @"User List"; -
break; -
} -
self.title = title; - }
在UITabBarController的子页面(为UIViewController实例)中,可以设置该子页面所对应的TabBar项的相关属性,如下:- -
(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - {
-
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; -
if (self) { -
// Custom initialization -
self.tabBarItem.title = @"User List"; -
self.tabBarItem.image = [UIImage imageNamed:@"chatIcon01"]; -
} -
return self; - }
六、UITabBarController子页面跳转到UINavigationController的下一个页面
从UITabBarController子页面跳转到UINavigationController的下一个页面,注意:前提是UITabBarController是属于UINavigationController导航链中的一个节点。
- //从UITabBarController的子页面跳转到UINavigationController的下一个页面:
- ChatViewController
*chatViewController = [[ChatViewController alloc] initWithNibName:@"ChatViewController" bundle:nil]; - UITabBarController
*homeController = self.tabBarController; - [chatViewController
setHomeDelegate:homeController]; - [self.tabBarController.navigationController
pushViewController:chatViewController animated:true];
这里说一下用代理来实现参数的回传,这个代理的宝义如下:- @protocol
HomeDelegate - -(void)
onComeback:(NSString*) message; - @end
需要在下一个页面(例子中的ChatViewController)中,添加这个代理作为它的属性,如下:- @interface
ChatViewController : UIViewController - @property
(weak) id homeDelegate; - @end
-
- @implementation
ChatViewController - @synthesize
homeDelegate; - @end
七、返回上一个页面与参数回传
要从ChatViewController返回到上一个页面,可执行下面代码:
- [homeDelegate
onComeback:@"Hello"]; - [self.navigationController
popViewControllerAnimate d:true];
这样,就可以实现了参数的回传。
UINavigationController的页面回退的两个常用方法:
- //返回导航的上一个页面
- [self.navigationController
popViewControllerAnimate d:true]; -
- //返回导航的第一个页面
- [self.navigationController
popToRootViewControllerA nimated:true];
@容新华技术博客 -
http://blog.youkuaiyun.com/rongxinhua - 原创文章,转载请注明出处
- //把UIViewController添加的应用中: