UIViewController、UINavigationController与UITabBarController的整合使用

UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器,它们都属于UIViewController的子类,继承关系如下:

@interface UITabBarController : UIViewController <uitabbardelegate, nscoding="">
@interface UINavigationController : UIViewController

UINavigationController:同级页面之间的跳转,界面典型的特点就是页面上部有一UINavigationBar导航条,导航条可以设置标题、左上角的按钮(一般用于返回),右上角的按钮,也可以自定义这些元素。

UITabBarController:父子页面之间的嵌套关系,界面典型的特点是耍耍下部有一UITabBar选项组,通过点击Tab,可切换上面的视图的变换。

UIViewController、UINavigationController、UITabBarController三者的整合使用,可以开发出大部分的App应用页面框架。

一、在我们项目AppDelegate中添加UIViewController

//把UIViewController添加的应用中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(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 dismissViewControllerAnimated: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] initWithRootViewController:homeViewController];
[self presentViewController:navigationController animated:true completion:^{}];

HomeViewController是一个UITabBarController子类,代码如下:

//HomeViewController是一个UITabBarController子类
@interface HomeViewController : UITabBarController<uitabbarcontrollerdelegate, homedelegate="">
@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:UIBarButtonItemStylePlain target:self action:@selector(onLeftBtnClick:)];
        self.navigationItem.leftBarButtonItem = leftBtn;
        //设置导航右上角的按钮
        UIImage *img = [UIImage imageNamed:@"msgIcon"];
        UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStyleBordered target:self action:nil];
        self.navigationItem.rightBarButtonItem = rightBtn;

        //新建Tab页面
        UserListViewController *userListViewController = [[UserListViewController alloc] initWithNibName:@"UserListViewController" bundle:nil];
        MessageListViewController *messageListViewController = [[MessageListViewController alloc] initWithNibName:@"MessageListViewController" bundle:nil];
        //添加Tab耍耍到Tab控制器
        self.viewControllers = @[messageListViewController, userListViewController];
        //设置UITabBarControllerDelegate代理
        self.delegate = self;
    }
    return self;
}

五、UITabBarController子页面之间的切换

HomeViewController实现了UITabBarControllerDelegate协议,可用于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 popViewControllerAnimated:true];

这样,就可以实现了参数的回传。

UINavigationController的页面回退的两个常用方法:

//返回导航的上一个页面
[self.navigationController popViewControllerAnimated:true];

//返回导航的第一个页面
[self.navigationController popToRootViewControllerAnimated:true];
时间: 2024-09-28 22:15:38

UIViewController、UINavigationController与UITabBarController的整合使用的相关文章

一张图让你清晰 UIViewController,UINavigationController和 UITabBarController的层次关系

在学习多视图控制器的时候,曾经有一个问题一直困扰着我,就是给标签栏title赋值的问题. 就常用的层次关系来说,一个标签栏视图 里面 套 一个 导航视图 ,导航视图 里 套 我们展示内容 的 内容视图 . UITabBarController->UINavigationController->UIViewController UITabBarController和UINavigationController 都继承自UIViewController UIViewControlleller  的

iOS开发——实战OC篇&amp;环境搭建之Xib(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术编程的代码创建界面,本篇我们将介绍一个老的技术,但是在很多的公司或者库里面还是使用这个技术,既然如此它肯定有他的好处,至于好处这里我就不一一介绍了.在Xcode5之前是只能使用Xib或者代码的,而代码又对于很多初学者来说算是一个难题.毕竟不知道怎么下手.所以我就总结了一下这段时间自己编写程序的一个实例来说明怎么

iOS开发——实战OC篇&amp;环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)

环境搭建之StoryBoard(玩转UINavigationController与UITabBarController) 研究了这么就IOS开发,都没有所处一个像样或者自己忙一点的项目.最近自己正打算开始着手做一个项目,可是不知道怎么下手,感觉前面学了好多,可是回头想想却又很难下手,其中最主要的就是第一步环境的搭建,当然在这之前还有选题和素材,但是那些对于ios开发来说都不是技术上的问题或者在以后公司里面一半都不是我们所考虑的.所以今天开始我将以三篇简短但又实用的文章给大家介绍一下,怎么搭建一个

iOS开发——实战OC篇&amp;环境搭建之纯代码(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleView Controller,命名未iCocos 二:由于我们使用的纯代码实现的,所以删除其中的StoryBoard和Viewtroller的两个文件 三:新建一个继承自TabBar Controller的类,我们命名问iCocos ViewController 三:在Appdelegate的实现文件中导入刚刚

UINavigationController与UITabBarController相关问题

UINavigationController与UITabBarController相关问题 UINavigationController与UITabBarController混用是非常常见的,有时候会遇到UINavigationController推出(push)出controller后隐藏UITabBarController的问题,很容易对吧. 源码如下: // // AppDelegate.m // NavigationController // // Copyright (c) 2014年

StoryBoard初探(二):使用UINavigationController和UITabBarController

UINavigationController StoryBoard的Segue类型有三种:Push,Modal,Custom.其中Push类型的Segue需要用到UINavigationController.第一步,先清空之前所有的连线和连接,选择ViewController,打开Editor菜单,选择Embed In选项中的Navigation Controller. 主窗口区域会出现一个UINavigationController实例 按照第一篇的方式,Ctrl连线ViewControlle

UINavigationController和UITabBarController合用

开发环境:Xcode4.5 很多时候我们创建一个基于UITabBarController的application以后还希望能够在每个tab view都可以实现导航控制,即添加一个UINavigationController来实现tabview内部的view之间的切换,这即是本文所要介绍的. 一.创建一个 Tabbed Application.默认创建的是带有两个Tab的工程. 二.在AppDelegate.h里面添加 @property (strong, nonatomic) UINavigat

iOS UINavigationController与UITabBarController的组合使用

1.导航类型 UINavigationController 适用于父子页面的跳转 UITabBarController 适用于平级页面的跳转 2.presentViewController / dismissViewControllerAnimated和pushViewController / popViewController (1)只有从UINavigationController导航过来的UIViewController 才可以使用pushViewController / popViewC

UINavigationController &#160;和 UITabBarController

UINavigationController当设置根控制器的时候,意思就是把根控制器压入栈内,当我们push的时候,我们把下一个控制器压入栈内,当我们pop的时候把上面的控制器的内存释放 UITabBarController的使用步骤 初始化UITabBarController 设置UIWindow的rootViewController为UITabBarController 根据具体情况,通过addChildViewController方法添加对应个数的子控制器 UITabBarControll