【iOS进阶】【多控制器】UINavigationController控制器

一、Xcode6如何创建一个Empty Application模版               

1> 运行Xcode 6,创建一个Single View Application工程。

 

2> 创建好后,把工程目录下的Main.storyboard和LaunchScreen.xib删除

    

3> 打开Info.plist,把Launch screen interface file base name,以及Main storyboard file base name两项删除

        

4>打开工程项目属性文件,点击Target下面的第一项,再选择General选项卡,向下找到Use Asset Catalog按钮,点击它。

    然后在弹框处点击“Migrate”。  

 

 

 

5>最后,在AppDelegate的第一个方法里面,“return”语句之前,添加必要代码。

//OC需要添加的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //1.创建window;2.设置window背景;3.使window可见。
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    self.window.backgroundColor = [UIColor whiteColor];
    
    [self.window makeKeyAndVisible];
    
    return YES;
}

 

二、多控制器管理的介绍                                                       

1> 一个iOS的app很少只由一个控制器组成,除非这个app极其简单,当app中有多个控制器的时候,我们就需要对这些控制器进行管理;

2> 有多个view时,可以用一个大的view去管理1个或者多个小view,控制器也是如此,用1个控制器去管理其他多个控制器;

3> 比如,用一个控制器A去管理3个控制器B、C、D,控制器A被称为控制器B、C、D的“父控制器”,控制器B、C、D的被称为控制器A的“子控制器”;

4> 为了便于管理控制器,iOS提供了2个比较特殊的控制器
   1.UINavigationController,利用它,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用;
   2.UITabBarController。

三、UINavigationController控制器                                  

 1> UINavigationController的使用步骤:

       1.初始化UINavigationController

       2.设置UIWindow的rootViewController为UINavigationController

       3.根据具体情况,通过push方法添加对应个数的子控制器

       代码如下:

       第一种方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    //1.创建导航控制器
    UINavigationController *nav = [[UINavigationController alloc] init];
    
    LYXOneViewController *one = [[LYXOneViewController alloc] init];
    //2.添加子控制器
    [nav pushViewController:one animated:YES];
    //3.把导航控制器设置为窗口的根控制器
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    return YES;
}

        第二种方法:(初始化的时候设置导航控制器的根子控制器)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    //1.创建子控制器
    LYXOneViewController *one = [[LYXOneViewController alloc] init];
    
    //2.创建导航控制器,初始化的时候设置导航控制器的根子控制器
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:one];
    
    //3.把导航控制器设置为窗口的根控制器
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    return YES;
}

 

2> UINavigationController的View结构

  

3> UINavigationController的子控制器

 

//UINavigationController以栈的形式保存子控制器
//存放所有子控制器的栈
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;

//使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

//使用pop方法可以移除控制器
//将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
//回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
//回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

//栈顶控制器
@property(nonatomic,readonly,retain) UIViewController *topViewController;

4> UINavigationController的导航条

      一个导航控制器,只有一个导航条。导航条的内容由栈顶控制器决定

      特例:返回键上的按钮是由上一个控制器决定的

//导航栏的内容由栈顶控制器的navigationItem属性决定

//UINavigationItem有以下属性影响着导航栏的内容
//左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
//中间的标题视图
@property(nonatomic,retain) UIView          *titleView;
//中间的标题文字
@property(nonatomic,copy)   NSString        *title;
//左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
//UIBarButtonItem *rightBarButtonItem  右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

5> 综合示例:

  1.第一个子控制器设置的代码

 

    @implementation LYXOneViewController
    
    //子控制器加载完毕后调用的方法
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //中间的标题文字
        self.navigationItem.title = @"第一个控制器";
        //左上角的视图,左上角为返回键,除了根子控制器外一般不设置此属性
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil];
//修改下一个界面返回按钮的文字 //返回键不需要设置style属性,因为它的style是默认的 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:(UIBarButtonItemStyleDone) target:nil action:nil]; } //跳到下一个子控制器的按钮方法 - (IBAction)jumpTwo:(id)sender { //跳到第二个界面 LYXTwoViewController *two = [[LYXTwoViewController alloc] init]; //拿到导航控制器 [self.navigationController pushViewController:two animated:YES]; }

 

  2.第二个子控制器的代码:

@implementation LYXTwoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    //中间的标题文字
    self.navigationItem.title = @"第二个控制器";
    //中间的的标题视图
    self.navigationItem.titleView = [UIButton buttonWithType:(UIButtonTypeContactAdd)];
    
    //右上角的视图
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil];
//右上角的视图组 //self.navigationItem.rightBarButtonItems //用法与rightBarButtonItem属性相同,但传入但是UIBarButtonItem变量的数组 } - (IBAction)hehe:(id)sender { //跳到第三个界面 LYXThreeViewController *two = [[LYXThreeViewController alloc] init]; //拿到导航控制器 [self.navigationController pushViewController:two animated:YES]; }

  3.第三个子控制器的代码:

@implementation LYXThreeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //中间的标题文字
    self.navigationItem.title = @"第三个控制器";
    //右上角的视图
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil];
}

//返回根子控制器的方法(此处为LYXOne)
- (IBAction)rootBtn:(id)sender {
    [self.navigationController popToRootViewControllerAnimated:YES];
}
//返回上一个子控制器(此处为LYXTwo)
- (IBAction)backBtn:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
}

 

四、storyboard导航实现多控制的使用                                  

1> 创建一个Single View Application工程

2> 打开Main.storyboard,把默认的View删除。添加Navigation Contrller控件

     1.添加Navigation Contrller控件,把系统自带的子控制器删除

    

    2.设置View Controller属性,使Navigation Contrller为程序的入口点

   

3> 根据需要创建继承自UIViewContrller的类,他们将是Navigation Contrller的子控制器

     这里将创建两个

    

4> 根据第三步创建的类的个数添加相应数量的View Contrller

     1.添加第一个子控制器(类型是View Contrller)

     2.设置子控件的View Contrller中的Class属性为第3步创建的类(此处为LYXOneViewController)

    

     3.添加第二个子控制器(类型是View Contrller)    

     4.设置子控件的View Contrller中的Class属性为第3步创建的类(此处为LYXTwoViewController)

5> 拖线,实现关联。并设置属性

1.右击Navigation Contrller,选择root view controller,把线托给刚创建的One View Contrller,让它成为Navigation Contrller的根子控制器

   

2.在One View Contrller上新建一个按钮,按住control拖线到Two View Contrller,选择push属性,建立关联

   

3.效果图:

  

4.设置子控制器标题的属性:

 

posted @ 2015-03-21 23:59  锟斤拷Dy  阅读(196)  评论(0)    收藏  举报