随意细解:UI -- UINavigationController、界面通信

UINavigationController

导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的控制器。继承于UIViewController,以栈的⽅式管理所控制的视图控制器,⾄少要有⼀个被管理的视图控制器。

工作原理

UINavigationController通过栈的⽅式管理控制器的切换,控制⼊栈和出栈来展⽰各个视图控制器。UINavigationController的ContentView⾥始终显⽰栈顶控制器的view。viewControllers属性存储了栈中的所有被管理的控制器。

属性

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

最轻量级 储存数据的类(数据持久化)

步骤

  • 存数据

    1. 初始化方法

      NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    2. 储存数据(以键值对的形式储存数据)

      [userDefault setObject:@"DJ" forKey:@"username"];
      [userDefault setObject:@"123456" forKey:@"password"];
    3. 同步数据

      [userDefault synchronize];
  • 取数据

    1. 初始化对象

      NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    2. 取数据

      NSString *username = [userDefault objectForKey:@"username"];
      NSString *password = [userDefault objectForKey:@"password"];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值