`

UIViewController、UINavigationController与UITabBarController的整合使用

    博客分类:
  • ios
 
阅读更多

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 <NSObject>
-(void) onComeback:(NSString*) message;
@end


需要在下一个页面(例子中的ChatViewController)中,添加这个代理作为它的属性,如下: 

@interface ChatViewController : UIViewController
@property (weak) id<HomeDelegate> homeDelegate;
@end

@implementation ChatViewController
@synthesize homeDelegate;
@end




七、返回上一个页面与参数回传 
要从ChatViewController返回到上一个页面,可执行下面代码: 

[homeDelegate onComeback:@"Hello"];
[self.navigationController popViewControllerAnimated:true];


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


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

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

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


@容新华技术博客 - http://blog.csdn.net/rongxinhua - 原创文章,转载请注明出处 
更多 

分享到:
评论

相关推荐

    iOS 自定义UINavigationController和UITabBarController

    `UITabBarController`管理多个`UIViewController`实例,用户可以在底部的标签之间切换。自定义`UITabBarController`通常包括以下步骤: 1. **自定义标签项**:可以修改`UITabBarItem`的图标、标题和颜色。也可以...

    页面跳转 UITabBarController+UINavigationController+UIViewController

    当`UITabBarController`与`UINavigationController`结合使用时,常常会在每个`TabBarItem`下嵌套一个`UINavigationController`,这样每个标签页都可以拥有自己的导航结构。例如,你可以在每个`TabBarItem`下面设置一...

    UITabBarController和UINavigationController混用

    在这个名为 "TabBarAndNavigation" 的示例项目中,开发者可能已经创建了一个实际运行的 Demo,展示了如何在 `UITabBarController` 和 `UINavigationController` 结合使用的场景下,根据需求动态隐藏和显示 `tabBar`...

    纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)

    这个话题将深入探讨如何使用纯代码方式来搭建一个包含三级结构的UI,即`UITabBarController` + `UINavigationController` + `UIViewController`。这个结构常用于大型应用,因为它提供了良好的导航和组织用户内容的...

    WHDropDownView:UINavigationController,UIViewController,UITabBarController,每个VC都可以添加此视图

    WHDropDownViewUINavigationController, UIViewController, UITabBarController, every VC can add this View.开门见山,先看效果图现在的移动端,用户的**“使用时长”**越来越得到重视。大量的App也使出浑身解数...

    斯坦福大学iOS开发教程2011年秋Lecture 10

    在Stanford CS193p课程中,讲解了如何通过控制拖拽(ctrl-drag)的方式来在Xcode中设置UITabBarController与各个ViewController之间的连接。这实际上是设置了UITabBarController的一个属性`@property(nonatomic,...

    UITabBarController简单demo

    这个示例代码创建了两个`UIViewController`,并分别用`UINavigationController`包裹,然后添加到`UITabBarController`中。最后,将`UITabBarController`设置为主窗口的根控制器。 在实际应用中,你可能还需要处理更...

    iOS+软件开发揭密:iPhone&iPad+企业应用和游戏开发样章.doc

    本文将根据给定的文档摘要,详细介绍iOS开发的基础知识,特别是iPhone程序框架及其核心组件,如UIViewController、UINavigationController和UITabBarController等。 #### 二、iPhone程序框架概览 iPhone应用程序...

    uitabbarcontroller navigationcontroller互相加载导航demo

    在iOS应用开发中,`UITabBarController` 和 `UINavigationController` 是两个非常重要的组件,它们分别用于实现底部标签栏切换和页面的栈式导航。`UITabBarController` 通常用作应用的基础视图控制器,展示多个子...

    IOS 多视图切换加动画

    多视图切换通常涉及到在不同的视图控制器之间进行切换,这可以通过多种方式来实现,例如使用UINavigationController、UITabBarController或自定义的页面滚动效果。 1. UINavigationController:这是iOS中最常见的多...

    navigation+uitabbarcontroller的代码

    - 可以先创建一个 `UITabBarController`,然后为每个 `TabBarItem` 分配一个已包装在 `UINavigationController` 中的 `UIViewController`。 - 例如,可以使用 `storyboard` 进行配置,或者在代码中动态创建并添加...

    ios-滑动菜单实现.zip

    10. **控制器容器(UINavigationController/UITabBarController)**:当滑动菜单与导航或标签栏结合时,可能涉及到对UINavigationController或UITabBarController的嵌套使用。 这个压缩包的代码示例可以帮助开发者...

    UINavigationControllerAND UITabBarController

    在iOS应用开发中,`UINavigationController` 和 `UITabBarController` 是两个至关重要的视图控制器类,它们在构建用户界面时起着核心作用。这两个组件是Apple的UIKit框架的一部分,用于实现导航和多视图控制。 `...

    iOS开发UITabBarController和UICollectionView的使用Demo

    在iOS应用开发中,`UITabBarController` 和 `UICollectionView` 是两个非常重要的组件。...对于更复杂的需求,还可以使用 `UINavigationController` 与 `UITabBarController` 结合,实现导航与标签栏的混合使用。

    AppRotation.zip

    本示例"AppRotation.zip"显然专注于探讨控制器在设备旋转时的行为,特别是普通控制器(UIViewController)与容器控制器(如UINavigationController、UITabBarController等)的差异。下面将详细阐述相关知识点。 1. ...

    UINavigationController

    1. **分段控制器(TabBarController)集成**:`UINavigationController`常与`UITabBarController`结合使用,为每个分段提供独立的导航结构。 2. **交互式Pop手势**:默认情况下,`UINavigationController`支持从左侧...

    深入讲解iOS开发中的UIViewController

    此外,UIViewController还能与其他类型的控制器,如UINavigationController和UITabBarController协作。UINavigationController用于实现页面间的导航,而UITabBarController则支持底部标签栏切换不同视图。这些控制器...

    AdaptLandscapeScreen:旋转手机自动适配屏幕与手动点击强制旋转控制器

    在做视频开发时遇到屏幕旋转问题,其中涉及到 StatusBar、 UINavigationController、UITabBarController 、UIViewcontroller。 在设备锁屏下的整体效果图 主要涉及以下4点: 横竖屏的旋转 屏幕旋转相应改变视图位置 ...

    ios自定义UITabBarController

    4. **实现页面跳转**:点击中间按钮后,通常会启动一个新的`UINavigationController`或直接present一个新`UIViewController`。这可以通过`pushViewController:animated:`或`present:animated:completion:`方法来完成...

Global site tag (gtag.js) - Google Analytics