您的位置:首页 > 产品设计 > UI/UE

随意细解: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"];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: