内容简介:
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];
*/
// 创建导航视图控制器
//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 ];
[ 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:]
}
[ 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];
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 ];
}
[ 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 ];
}
[ 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 ];
[ 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();
[ 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" );
}
// // 设置导航栏 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 ];
}
[ 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 ];
}