内容简介:
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];
}