随意细解:UI -- UINavigationController、界面通信
2015-11-21 15:57
375 查看
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"];
相关文章推荐
- 1051 Pop Sequence
- iOS开发 UI实现的三种动画
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
- NHibernate Query
- UIGestureRecognizer手势识别器
- UITableView优化技巧
- Apue Chapter 5 习题答案
- Uiautomator环境搭建
- GPUImage简单滤镜使用之色阶(三)
- 对频率论(Frequentist)方法和贝叶斯方法(Bayesian Methods)的一个总结
- UIView的userInteractionEnabled属性的意义
- easyui datagrid 部分参数
- Spoj 1716 Can you answer these queries III
- spoj SPOJ 1043 Can you answer these queries I
- Java中EventQueue.invokeLater干什么用的
- UITableViewCell 初始化
- PAT 1041. Be Unique (20)
- Eclispe环境启动遇This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- Maximizing the Spread of Influence through a Social Network
- 27.iOS中最重要的视图UITableView表视图第二章