1. UINavigationController属性
①UINavigationController 继承自UIViewController, 导航控制器是 iOS 中提供的用来管理多个视图控制器的控制器,被它管理的视图控制器,必须要有层级关系(就是以来关系,即下一个视图的出现要依赖于前一个视图).多视图控制器的运行原理就是一个创建和销毁的过程
② 进入下一级界面,创建下一级界面的视图控制器, push 进入
返回上一级界面, pop 返回
③导航控制器以栈的形式管理多个单视图控制器,push 时视图控制器进栈, pop 时视图控制器出栈(空间被回收,销毁),屏幕上永远显示的是栈顶元素
④ 重要属性: viewControllers,永远获取的是当前栈中的所有元素.
⑤ 在新创建一个视图控制器进行跳转测试的时候,需要将新创建的视图控制器添加背景颜色,(为了防止出现卡顿现象)
⑥UINavigationController跳转实现:
创建导航视图控制器
UINavigationController *rootVC = [[UINavigationController alloc]initWithRootViewControl:first];
设置 window 的跟视图控制器
self.window.rootViewController = rootVC;
[rootVC release];
2. UINavigationController进行界面切换的时候,触发的事件
1⃣视图将要出现的时候,一般会在这里做数据刷新
-(void)viewWillAppear: (BOOL)animated;
2⃣ 视图将要消失
-(void)viewWillDisappear: (BOOL)animated;
3⃣视图已经出现
-(void)viewDidAppear: (BOOL)animated;
4⃣视图已经消失
-(void)viewDidDisappear: (BOOL)animated;
5⃣当界面切换时,两个视图控制器,A与 B中视图的显示/消失的过程
从 Apush到 B(从前到后): A(viewWillDisappear:)->B(viewWillAppear)->A(viewDidDisappear:)->B(viewDidAppear:)
从 Bpop到 A(从后到前): B(viewWillDisappear:)->A(viewWillAppear:)->B(viewDidDisappear:)->A(viewDidAppear:)
当从后一个界面返回上一个界面时,会触发上一个界面的 viewWillAppear: 以及 viewDidAppear:,viewWillappear: 时机非常重要
6⃣视图控制器之间的跳转
点击 Button 按钮的时候触发:
① 首先创建要跳转到界面的视图控制器
SencondViewController *secondVC = [SencondViewController alloc]init];
① 通过导航控制器进入下一个界面
[self.navigationController pushViewController:secondVC animated:YES];
self.navigationController 返回自身所在的多视图控制器(UINavigationController)
[secondVC release];
② pop的实现
得到多视图控制器,直接放回上一级页面
[self.navigationController popViewControllerAnimated:YES];
返回导航控制器的根视图控制器(返回第一个页面)
[self.navigationController popToRootViewControllerAnimated:YES];
③ 返回到指定界面
[self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES];
viewControllers[1]返回当前多视图控制器中的单视图控制器的名称(单视图在进栈的时候被存放在一个数组中,所以可以按数组的下标跳转到对应的界面)
7⃣配置多视图控制器的公共属性(也就是导航栏中的公共属性,该属性适用于所有的界面)
① 设置导航条颜色
self.navigationController.navigationBar.barTintColor= [UIColor orangeColor];
② 关闭导航条的毛玻璃
self.navigationController.navigationBar.translucent = YES;
③ 隐藏导航条
self.navigationController.navigationBarHidden = NO;默认为 NO
④ 设置导航条内容的颜色
self.navigationController.navigationBar.tintColor = [UIColor magentaColor];
⑤ 设置导航条的背景颜色
[self.navigationController.navigationBar setBackgroundImage:
[UIImage imageNamed:@”name”] forBarMetricsDefault];
9. 针对第一个界面单独定制导航条上的内容1⃣配置导航条上显示的标题
self.navigationItem.title = @”FirstVC”;
2⃣配置导航条的标题视图
UISegmentedControl *segc = [UISegmentedControlalloc]initWithItems:
@[@”消息”,@”电话”];
[segc release];
3⃣设置一个左按钮,显示废纸篓按钮
1> 创建按钮
UIBarButtonItem *barButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemTrash:
self action:@selector(barButton:)];
2> 给 leftBarButtonItem赋值
self.navigationItem.leftBarButtonItem = barButton;
设置有按钮的方法:
UIBarButtonItem *barButton1 = [UIBarButtonItemalloc]initWithTitle:@”添加” style:
(UIBarButtonItemStyleDone) target:selfaction:@selector(rightBtn:);
self.navigationItem.rightBarButtonItem = barButton1;
3> 实现按钮的点击事件
10. UINavigationController 多视图控制器界面跳转传值情况:属性传值的步骤:
1> 属性传值的第一步,定义属性
在下一个视图控制器中,定义一个属性.(需要显示信息界面定义一个接收数据的属性)
在 SecondViewController 中定义一个 text 属性@property
(nonatomic,retain)NSString *text;
2> 属性传值第二步, push 之前传入数据
在页面跳转之前,将传递的信息赋值给下一个视图控制器(即在第一步的时候创建的属性)
SecondViewController *second = [SecondViewControlleralloc]
Init];
second.text = self.textField.text; 将文本框的内容赋值给第一步定义的 text;
3> 属性传值第三步,取出数据,给控件赋值
在第二个视图控制器加载的时候,将获得的数据赋值给视图控制器.
self.lable.text= self.text;
11. 代理传值
1> 代理传值第一步,定义一个协议(定义协议的方法)
@protocol SecondViewControllerDelegate<NSObject>
- (void)passValue:(NSString *)text;
@end
2> 代理传值第二步,定义代理属性(一般格式)
@property(nonation,assign)id<SecondViewControllerDelegate>delegate;
3> 代理传值第三步,在其他文件指定代理对象
secondVC.delegate = self;
4> 代理传值第四步,遵循代理协议
5> 代理传值第五步,实现协议中的方法
6> 代理传值第六步,让代理实现协议中的方法
//判断代理有没有实现协议中的方法
if([self.delegaterespondsToSelector:@selector(passValue:)]){
[self.delegate passValue:self.textFiled.text];
/*代理在执行方法时的内部实现
self.lable.text = text;
*/}
[self.navigationContorllerpopViewControllerAnimated:YES];
12. 单例传值
1> 单例传值第一步,定义一个单例类
2> 单例传值第二部,定义一个单例的方法(通常为类方法)
+ (Singlleton *)shareSinglleton;
3> 代理传值的第三步,定义一个单例属性,存储传输的数据
@property (nonatomic,copy)NSString *text;
4> 实现定义的类方法
static Singlleton *single = nil;
+(Singlleton *)shareSinglleton{
@synchronized (self){ //同步操作,保证在多线程中的安全
if(!single){
single = [[Singlleton alloc]init];
}
}
return single;
}
5> 单例传值第四步, push 之前将输入的数据存储到单例对象的属性text中.
[Singlleton shareSinglleton].text = self.textField.text;
6> 单例传值第五步,从单例对象中取出属性所存储的数据,给我们的需要跳转的页面赋值
self.lable.text = [Singlleton shareSinglleton].text;
#import "FirestViewController.h"
#import "SecndViewController.h"
@interface FirestViewController ()
@end
@implementation FirestViewController
/*
当界面切换时,两个视图控制器, A与 B 中视图的显示/消失过程
从 Apush 到 B(从前到后) : A(viewWillDisappear:) -> B(viewWillAppear:) ->A(viewDidDisappear:) ->B(viewDidAppear:)
从 Bpop 到 A(从后到前): B(viewWillDisappear:) -> A (viewWillAppear:)-> B(viewDidDisappear:) -> A(viewDidAppear:)
当从后一个界面返回上一个界面时,会触发上一个界面的 viewWillAppear: 以及 viewDidAppear:
viewWillappear:时机非常重要
*/
// 视图将要出现,一般会在这里做数据刷新
- (void)viewWillAppear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
//NSLog(@"%@",self.view.superview);
}
- (void)viewWillDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
// 视图已出现
- (void)viewDidAppear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
- (void)viewDidDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
NSLog(@"%s",__FUNCTION__);
[self layoutPushButton];
[self configureCommonPropery];
[self customNavigationBarConten];
}
#pragma mark -------配置公共的属性,该属性适用于所有的界面-----------
- (void)configureCommonPropery{
// 1.设置导航条颜色
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
// 2.关闭导航条的毛玻璃
self.navigationController.navigationBar.translucent = YES;
// 3.隐藏导航条
self.navigationController.navigationBarHidden = NO; // 默认 为 NO
// 4.设置导航条内容的颜色
self.navigationController.navigationBar.tintColor = [UIColor magentaColor];
// 5.导航条的背景颜色
//[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
}
#pragma mark ----------针对第一个界面单独定制导航条上的内容-------------------
- (void)customNavigationBarConten{
// 1.配置导航条上显示的标题
self.navigationItem.title = @"FirstVC";
// 2.配置导航条的标题视图
UISegmentedControl *segC= [[UISegmentedControl alloc]initWithItems:@[@"消息",@"电话"]];
self.navigationItem.titleView = segC;
[segC release];
// 3.设置一个 左button,显示废纸篓按钮
// 1>创建按钮
UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(barButton:)];
// 2> 给 leftBarButtonItem 赋值
self.navigationItem.leftBarButtonItem = barButton;
// 4. 设置右按钮
//UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(rigthBtn:)];
UIBarButtonItem *barButton1 = [[UIBarButtonItem alloc]initWithTitle:@"添加" style:(UIBarButtonItemStyleDone) target:self action:@selector(rigthBtn:)];
self.navigationItem.rightBarButtonItem = barButton1;
}
// 实现左按钮的点击方法
- (void)barButton:(UIBarButtonItem *)sender{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否删除联系人?" delegate: self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
[alert show];
}
- (void)rigthBtn:(UIBarButtonItem *)sender{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否添加联系人?" delegate: self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
[alert show];
}
// 进入下一个界面
- (void)layoutPushButton {
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(50, 150, 220, 40);
[button setTitle:@"进入下一级" forState: UIControlStateNormal];
button.backgroundColor = [UIColor whiteColor];
[self.view addSubview: button];
[button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
// 点击事件
- (void)btnClick:(UIButton *)sender{
// 1.创建第二个视图控制器
SecndViewController *secondVC = [[SecndViewController alloc]init];
// 2.通过导航控制器进入下一个界面
// 得到自身所在的多视图控制器(UINavigationController)
[self.navigationController pushViewController:secondVC animated:YES];
[secondVC release];
}
- (void)dealloc{
NSLog(@"1被销毁了");
[super dealloc];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end