【UI初级--连载六】---------导航控制器(UINavigationController)

内容简介:
1、创建导航控制器 
2、push、pop、root、index 
3、设置导航栏

导航控制器 UINavigationController 是用来管理子控制器的切换的大管家
导航控制器是个管理型的控制器,他本身不显示视图内容,而是管理子控制器的视图显示
UINavigationController UIViewController 的子类
一、创建导航控制器
APPDelegate.m文件中:
RootViewController *rootVC = [[ RootViewController alloc ] init ];
   
// 创建导航视图控制器
   
//RootViewController 让一个控制器作为导航控制器的跟试图控制器
   
UINavigationController *nav = [[ UINavigationController alloc ] initWithRootViewController :rootVC];
   
NSLog ( @"App-----%@" ,nav);
   
/*
     //
原理
     [nav.view addSubview:rootVC.view];
     */
// 使用导航控制器作为 window 的根控制器
    self . window . rootViewController = nav;

RootViewController.m文件中:
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view.
   
   
self . view . backgroundColor = [ UIColor redColor ];
   
self . title = @"Root" ;
   
   
// 导航栏的高度是 44
   
   
// 注意: iOS7 之前, self.view 的坐标是从( 0 64 )开始的,在 ios7 之后,导航栏和状态栏全部透明,仍旧是( 0 0 )开始
   
// 添加一个子视图
   
UIView *myView = [[ UIView alloc ] initWithFrame : CGRectMake ( 0 , 64 , 100 , 100 )] ;
    myView.
backgroundColor = [ UIColor greenColor ];
    [
self . view addSubview :myView];
   
   
   
// 添加一个按钮
   
UIButton *btn = [ UIButton buttonWithType : UIButtonTypeCustom ];
    btn.
frame = CGRectMake ( 50 , 300 , 200 , 40 );
    btn.
backgroundColor = [ UIColor grayColor ];
    [btn
setTitle : @"push" forState : UIControlStateNormal ];
    [btn
addTarget : self action : @selector (btnClick:) forControlEvents : UIControlEventTouchUpInside ];
    [
self . view addSubview :btn];
 
}

- (
void )btnClick:( UIButton *)btn{
   
// 创建二级界面控制器
   
SecondViewController *second = [[ SecondViewController alloc ] init ];
   
//push 到下一个控制器
   
//navigationController 是每一个视图控制器( UIViewController )都有的属性 , 如果说该控制器被放在某个导航控制器中管理,则能够直接拿到这个导航控制器,如果没有放到导航控制器中管理,则此属性对象为 nil
   
NSLog ( @"Root----%@" , self . navigationController );
   
//push
    [
self . navigationController pushViewController :second animated : YES ];
}

SecondViewController.m文件中:

- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view.
   
self . view . backgroundColor = [ UIColor orangeColor ];
   
self . title = @"Second" ;
   
   
   
// 添加一个按钮
   
UIButton *btn = [ UIButton buttonWithType : UIButtonTypeCustom ];
    btn.
frame = CGRectMake ( 50 , 300 , 200 , 40 );
    btn.
backgroundColor = [ UIColor grayColor ];
    [btn
setTitle : @"pop" forState : UIControlStateNormal ];
    [btn
addTarget : self action : @selector (btnClick:) forControlEvents : UIControlEventTouchUpInside ];
    [
self . view addSubview :btn];
   
}


- (
void )btnClick:( UIButton *)btn{
   
// 返回 ----POP 到上一级界面
    [
self . navigationController popViewControllerAnimated : YES ];
//    [self.navigationController popToRootViewControllerAnimated:YES];
//    [self.navigationController popToViewController: animated:]
}

二、push、pop、root、index
xib创建:
APPDelegate.m文件中:
FirstViewController *firstVC = [[ FirstViewController alloc ] init ];
   
UINavigationController *nav = [[ UINavigationController alloc ] initWithRootViewController :firstVC];
    self.window.rootViewController = nav;

FirstViewController.m文件中:
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view from its nib.
   
self . title = @" 1 个控制器 " ;
}
- (
IBAction )butClick:( UIButton *)sender {
   
SecondViewController *second = [[ SecondViewController alloc ] init ];
    [
self . navigationController pushViewController :second animated : YES ];
}


SecondViewController.m文件中:
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view from its nib.
   
self . title = @" 2 个控制器 " ;
}
- (
IBAction )butClick:( UIButton *)sender {
   
OtherViewController *other = [[ OtherViewController alloc ] init ];
    [
self . navigationController pushViewController :other animated : YES ];
}


OtherViewController.m文件中:
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view from its nib.
   
   
self . view . backgroundColor = [ UIColor colorWithRed : arc4random ()% 10 * 0.1 green : arc4random ()% 10 * 0.1 blue : arc4random ()% 10 * 0.1 alpha : 1 ];
   
   
NSInteger count = self . navigationController . viewControllers . count ;
   
self . title = [ NSString stringWithFormat : @" %ld 个控制器 " ,count];
}
- (
IBAction )btnClick:( UIButton *)btn {
   
if (btn. tag == 100 ) {
       
//push
       
OtherViewController *other = [[ OtherViewController alloc ] init ];
        [
self . navigationController pushViewController :other animated : YES ];
       
    }
else if (btn. tag == 101 ){
       
//pop
        [
self . navigationController popViewControllerAnimated : YES ];
       
    }
else if (btn. tag == 102 ){
       
//root
        [
self . navigationController popToRootViewControllerAnimated : YES ];
       
    }
else if (btn. tag == 103 ){
       
       
//AlertController
       
UIAlertController *alertCtrl = [ UIAlertController alertControllerWithTitle : @" 注意 " message : @" 请输入要跳转至第几个控制器 " preferredStyle : UIAlertControllerStyleAlert ];
       
       
//AlertAction
       
UIAlertAction *alertAction = [ UIAlertAction actionWithTitle : @" 确定 " style : UIAlertActionStyleDefault handler :^( UIAlertAction *action) {
           
// 拿到 textField 中的值
           
UITextField *textField = [[alertCtrl textFields ] lastObject ];
           
NSInteger index = [textField. text integerValue ];
           
           
NSArray *viewControllers = self . navigationController . viewControllers ;
           
// 安全处理
           
if (index < 0 || index >= viewControllers. count - 1 ) {
               
NSLog ( @" 输入违法 " );
               
return ;
            }
           
UIViewController *vc = viewControllers[index];
            [
self . navigationController popToViewController :vc animated : YES ];
        }];
        [alertCtrl
addAction :alertAction];
       
       
//TextField
        [alertCtrl
addTextFieldWithConfigurationHandler :^( UITextField *textField) {
            textField.
textAlignment = NSTextAlignmentCenter ;
            textField.
keyboardType = UIKeyboardTypeNumberPad ;
        }];
       
        [
self presentViewController :alertCtrl animated : YES completion : nil ];
       
    }     
}


三、设置导航栏

APPDelegate.m文件中:


RootViewController.m文件中:
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view.
   
   
self . view . backgroundColor = [ UIColor redColor ];
   
   
CGFloat screenWidth = [ UIScreen mainScreen ]. bounds . size . width ;
//    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
   
   
self . title = @"Root" ;
   
// 这种用法很少 , 一般直接设置 title
//    self.navigationItem.title = @"Root";
   
   
// 设置导航栏的背景图片
   
UIImage *img = [ UIImage imageNamed : @"navbar_bg_normal.png" ];
   
//修改图片的大小
   
UIGraphicsBeginImageContext(CGSizeMake(screenWidth, 64));
    [img
drawInRect:CGRectMake(0, 0, screenWidth, 64)];
    img =
UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
// 导航栏背景
//    [self.navigationController.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
   
//    // 设置导航栏 title 的字体的颜色,大小
//    self.navigationController.navigationBar.titleTextAttributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:20], NSForegroundColorAttributeName: [UIColor redColor]};
   
   
   
// 设置 titleView
   
UIButton *titileBtn = [ UIButton buttonWithType : UIButtonTypeCustom ];
    [titileBtn
setTitle : @"titleBtn" forState : UIControlStateNormal ];
    [titileBtn
addTarget : self action : @selector (titleBtnClick:) forControlEvents : UIControlEventTouchUpInside ];
    titileBtn.
backgroundColor = [ UIColor greenColor ];
    titileBtn.
frame = CGRectMake ( 0 , 0 , 100 , 40 );
   
self . navigationItem . titleView = titileBtn;
   
   
   
/********* 创建导航栏上左右两边的按钮 ***********/
   
   
// 第一种方法
   
// 初始化一个 UIBarButtonItem 的实例,初始化一个系统的 Item
   
UIBarButtonItem *item1 = [[ UIBarButtonItem alloc ] initWithBarButtonSystemItem : UIBarButtonSystemItemBookmarks target : self action : @selector (item1Action:)];
//    self.navigationItem.leftBarButtonItem = item1;
   
   
// 第二种方法
   
// 初始化一个带图片的 UIBarButtonItem 实例
   
UIBarButtonItem *item2 = [[ UIBarButtonItem alloc ] initWithImage :[ UIImage imageNamed : @"btn_search.png" ] style : UIBarButtonItemStyleDone target : self action : @selector (item2Action:)];
   
self . navigationItem . leftBarButtonItems = @[ item1, item2 ] ;

   
// 第三种方式
   
// 初始化一个只带标题的 UIBarButtonItem 实例
//    UIBarButtonItem *item3 = [[UIBarButtonItem alloc] initWithTitle:@"hehe" style:UIBarButtonItemStyleDone target:self action:@selector(item3Action:)];
//    self.navigationItem.leftBarButtonItem = item3;
   
   
   
// 第四种方法 ( 最常用的方法 )
   
// 通过自定义视图设置
   
UIButton *btn = [ UIButton buttonWithType : UIButtonTypeCustom ];
    [btn
setBackgroundImage :[ UIImage imageNamed : @"btn_search.png" ] forState : UIControlStateNormal ];
    btn.
frame = CGRectMake ( 0 , 0 , 33 , 32 );
   
UIBarButtonItem *item4 = [[ UIBarButtonItem alloc ] initWithCustomView :btn];
   
self . navigationItem . rightBarButtonItem = item4;
   
   
   
UIView *view1 = [[ UIView alloc ] initWithFrame : CGRectMake ( 0 , 200 , 100 , 100 )];
    view1.
backgroundColor = [ UIColor blueColor ];
    [
self . view addSubview :view1];
   
   
}

- (
void )item1Action:( UIBarButtonItem *)btn
{
   
NSLog ( @"item1 click" );
   
//PUSH
   
DetailViewController *detailVC = [[ DetailViewController alloc ] init ];
    [
self . navigationController pushViewController :detailVC animated : true ];
}

- (
void )item2Action:( UIBarButtonItem *)btn
{
   
NSLog ( @"item2 click" );
}

- (
void )item3Action:( UIBarButtonItem *)btn
{
   
NSLog ( @"item3 click" );
}

- (
void )titleBtnClick:( UIButton *)btn
{
   
NSLog ( @"titleBtn click" );
}


SecondViewController.m文件中:

- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// Do any additional setup after loading the view.
   
self . view . backgroundColor = [ UIColor cyanColor ];
   
   
self . title = @"Detail" ;
   
   
// 第四种方法 ( 最常用的方法 )
   
// 通过自定义视图设置
   
UIButton *btn = [ UIButton buttonWithType : UIButtonTypeCustom ];
    [btn
setBackgroundImage :[ UIImage imageNamed : @"btn_search.png" ] forState : UIControlStateNormal ];
    btn.
frame = CGRectMake ( 0 , 0 , 33 , 32 );
    [btn
addTarget : self action : @selector (btnClick:) forControlEvents : UIControlEventTouchUpInside ];
   
UIBarButtonItem *item4 = [[ UIBarButtonItem alloc ] initWithCustomView :btn];
   
   
// 一般在 iOS6 中我们经常这样自定义返回上一级的按钮
   
// iOS7 以后,如果自定义返回上一级的按钮,则系统的抽屉式导航手势失效
   
self . navigationItem . leftBarButtonItem = item4;
   
   
// 设置导航栏的风格
//    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
   
   
// 设置导航栏不透明
//    self.navigationController.navigationBar.translucent = false;
   
   
// 设置导航栏颜色
//    self.navigationController.navigationBar.barTintColor = [UIColor redColor];
   
   
// 设置导航栏提示用户的内容 ( 用得比较少 )
   
self . navigationItem . prompt = @"hehehe" ;
}

- (
void )btnClick:( UIButton *)btn
{
    [
self . navigationController popViewControllerAnimated : true ];
   
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值