• 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];
  • 相关阅读:
    java集合 stream 相关用法(1)
    ICE新手入门版
    spring中关于FeignClient的错误 QueryParam.value() was empty on parameter 1
    Java Base64解析
    Java RSA加密以及验签
    项目拆分子工程(简单版)
    mysql "ON DUPLICATE KEY UPDATE" 的使用
    关于多定时任务开发
    AtomicInteger保证线程安全的全局变量
    C++矩阵库 Eigen 快速入门
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5002847.html
Copyright © 2020-2023  润新知