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

本文详细介绍了如何使用导航控制器UINavigationController来管理iOS应用中的界面切换,包括创建导航控制器、推栈、弹栈操作及设置导航栏。通过实例演示了如何在不同控制器间进行界面的切换与管理,并展示了如何自定义导航栏的样式与功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

导航控制器UINavigationController是用来管理子控制器的切换的大管家
导航控制器是个管理型的控制器,他本身不显示视图内容,而是管理子控制器的视图显示
UINavigationControllerUIViewController的子类
一、创建导航控制器
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之后,导航栏和状态栏全部透明,仍旧是(00)开始
   
//添加一个子视图
   
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];
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值