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

原创 2015年11月21日 15:57:56

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"];
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

随意细解:UI -- UIScrollView、UIPageControl

UIScrollView、UIPageControl
  • M_MU_U
  • M_MU_U
  • 2015年11月18日 22:49
  • 372

随意细解:UI -- 集合视图

集合视图UICollectionView
  • M_MU_U
  • M_MU_U
  • 2015年12月11日 14:38
  • 308

随意细解:UI -- 数据库

数据库
  • M_MU_U
  • M_MU_U
  • 2015年12月10日 23:14
  • 548

随意细解:UI -- 事件处理

事件事件、触摸、晃动、响应者链
  • M_MU_U
  • M_MU_U
  • 2015年11月14日 15:30
  • 273

随意细解:UI -- 标签视图控制器

UITabBarController标签视图控制器、Block高级--回调传值
  • M_MU_U
  • M_MU_U
  • 2015年11月28日 19:55
  • 367

随意细解:UI -- 设计模式、手势识别

target/Action代理模式、delegate代理模式、手势识别
  • M_MU_U
  • M_MU_U
  • 2015年11月16日 21:44
  • 492

随意细解:UI -- 自定义视图、视图控制器

自定义视图、视图控制器指定自定义view、检测屏幕旋转、处理内存警告、容器视图控制器...
  • M_MU_U
  • M_MU_U
  • 2015年11月14日 14:17
  • 631

随意细解:UI -- 网络编程

网络编程--GET请求方式(同步、异步)、POST请求方式(同步、异步)及区别
  • M_MU_U
  • M_MU_U
  • 2015年12月03日 22:46
  • 207

随意细解:UI --UITableView编辑

UITableView编辑
  • M_MU_U
  • M_MU_U
  • 2015年11月24日 22:01
  • 190

随意细解:UI -- MVC、通知

MVC、通知
  • M_MU_U
  • M_MU_U
  • 2015年12月17日 16:52
  • 207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:随意细解:UI -- UINavigationController、界面通信
举报原因:
原因补充:

(最多只允许输入30个字)