UINavigationController
导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的控制器。继承于UIViewController,以栈的⽅式管理所控制的视图控制器,⾄少要有⼀个被管理的视图控制器。
工作原理
UINavigationController通过栈的⽅式管理控制器的切换,控制⼊栈和出栈来展⽰各个视图控制器。UINavigationController的ContentView⾥始终显⽰栈顶控制器的view。viewControllers属性存储了栈中的所有被管理的控制器。
navigationBar
属性
iOS 7.0后 导航条默认是半透明的,起始点是屏幕的左上角。关闭半透明后,起始点从导航条下面开始计算。
状态栏高度:20 (状态栏的背景是导航条延伸过去的)
导航条高度:44 (横屏状态下,导航条高32)
- 设置导航条的颜色
self.navigationController.navigationBar.backgroundColor =[UIColor cyanColor];
设置背景图片
1.图片高度 < 44 效果:平铺
2.图片高度 = 44 效果:只覆盖导航条
3.图片高度 > 44 && < 54 效果:平铺
4.图片高度 = 64 效果:覆盖导航条与状态栏
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"image"] forBarMetrics:(UIBarMetricsDefault)];
- 关闭半透明
self.navigationController.navigationBar.translucent = NO;
UIBarButtonItem
- 导航条上的按钮
使用UIBarButtonItem
设置左按钮
// barButtonItemClick:为点击事件
UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithTitle:@"跳转" style:(UIBarButtonItemStylePlain) target:self action:@selector(barButtonItemClick:)];
self.navigationItem.leftBarButtonItem = item;
设置右按钮(图片)
// rightBarButtonClick:为点击事件
UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"right"] style:(UIBarButtonItemStylePlain) target:self action:@selector(rightBarButtonClick:)];
self.navigationItem.rightBarButtonItem = rightBarButton;
- 设置页面的导航栏标题
self.navigationItem.title = @"首页";
- 在标题位置设置一个view视图
UIView *titleView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 44)];
titleView.backgroundColor = [UIColor blueColor];
self.navigationItem.titleView = titleView;
[titleView release];
入栈和出栈
pushViewController:animated
进⼊下⼀个视图控制器
popViewControllerAnimated:
返回上⼀个视图控制器
popToViewController:animated
返回到指定的视图控制器
popToRootViewControllerAnimated
返回到根视图控制器
//在viewDidLoad方法中给按钮添加点击事件
[button addTarget:self action:@selector(buttonClick:) forControlEvents:(UIControlEventTouchUpInside)];
// 点击按钮,跳转到下一个界面的方法
- (void)buttonClick:(UIButton *)button
{
SecondViewController *secondVC = [[SecondViewController alloc]init];
// 视图控制器中有一个导航控制器的属性
// 一旦这个视图控制器被导航控制器管理了,那么视图控制器中的导航控制器就会有值
// 并且这个值就是管理他的那个导航控制器
[self.navigationController pushViewController:secondVC animated:YES];
[secondVC release];
}
// 在第二个ViewController中写跳回的方法
- (void)buttonClick:(UIButton *)button
{
[self.navigationController popViewControllerAnimated:YES];
}
界面间传值
一般从前往后用属性传值, 从后往前用代理传值
属性传值
1.先获取到要传的值
2.在第二个页面声明一个属性,这个属性用来接收传过来的值
- (void)buttonClick:(UIButton *)button
{
SecondViewController *second = [[SecondViewController alloc]init];
[self.navigationController pushViewController:second animated:YES];
// 获取要传的值
UITextField *field = (UITextField *)[self.view viewWithTag:1000];
// 传值相当于给第二个页面的属性赋值
second.str = field.text;
[second release];
}
在SecondViewController.h中声明属性:
@property (nonatomic, retain) NSString *str;
代理传值
1.创建一个协议
2.声明一个方法,用于传值,传的值就是方法的参数
3.声明一个属性用于传值
4.通过代理把值传回去
5.遵守协议
6.实现协议中的方法
7.设置代理
在SecondViewController.h中:
// 创建一个协议
@protocol SecondViewDelegate <NSObject>
// 声明一个方法,用于传值,传的值就是方法的参数
- (void)valueChange:(NSString *)text;
@end
// 声明一个属性用于传值
@property (nonatomic, assign) id<SecondViewDelegate> delegate;
- (void)buttonClick:(UIButton *)button
{
// 明确传值的位置(从后往前传)
// 相当于让代理去干活
// 安全判断
if ([_delegate respondsToSelector:@selector(valueChange:)]) {
UITextField *textField = (UITextField *)[self.view viewWithTag:2000];
// 通过代理把值传回去
[_delegate valueChange:textField.text];
}
// 返回上一个界面
[self.navigationController popViewControllerAnimated:YES];
}
在RootViewController.h中遵守协议:
@interface RootViewController : UIViewController <SecondViewDelegate>
实现协议中的方法:
- (void)valueChange:(NSString *)text
{
UITextField *field = (UITextField *)[self.view viewWithTag:1000];
field.text = text;
}
// 设置代理
second.delegate = self;
NSUserDefaults
最轻量级 储存数据的类(数据持久化)
步骤
存数据
- 初始化方法
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
储存数据(以键值对的形式储存数据)
[userDefault setObject:@"DJ" forKey:@"username"]; [userDefault setObject:@"123456" forKey:@"password"];
同步数据
[userDefault synchronize];
- 初始化方法
取数据
初始化对象
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
取数据
NSString *username = [userDefault objectForKey:@"username"]; NSString *password = [userDefault objectForKey:@"password"];