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

UIday0801:UINavigationController视图控制器的属性和用法

2015-09-04 11:59 603 查看
UINavigationController 是一个栈结构

push入栈

pushViewController:animated: 这个方法使用需要一个视图控制器作为参数

pop 出栈

popViewControllerAnimated: 弹出栈顶视图控制器

popToViewController:animated: 弹出到指定视图控制器,一般需要配合ViewController属性(数组)使用。

popToRootViewControllerAnimated: 弹出到根视图控制器

注意:

1、出栈和入栈都要先找到navigationController

2、一个navagationController至少要有一个视图控制器,叫根视图控制器

属性:

1、ViewControllers //这是一个数组,数组中是所有栈中的视图控制器

2、topViewController //这是在栈顶位置视图控制器

3、visibleViewController //当前正在显示的视图控制器(未必是栈顶,以后会学到一种模式不入栈 但是可以显示)

4、navigationBar //导航条 可以设置

UINavigationController:

导航控制器,是iOS中最常⽤用的多视图控制器

之⼀一,它⽤用来管理多个视图控制器。

导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的

控制器。

UINavigationController继承于UIViewController,以栈的⽅方式管理所

控制的视图控制器,⾄至少要有⼀一个被管理的视图控制器,这个控制器

我们称作,导航控制器的根视图控制器。

任何继承⾃自UIViewController的类(多态)都可以作为根控制器。

工作原理:

UINavigationController通过栈的⽅方式管理控制器的切换,控制⼊入栈和出栈

来展⽰示各个视图控制器。 UINavigationController的ContentView⾥里始终显⽰示栈顶控制器的view。

viewControllers属性存储了栈中的所有被管理的控制器

navigationController属性,⽗父类中的属性,每个在栈中的控制器,都能通 过此属性,获取⾃自⼰己所在的UINavigationController对象。

实现页面间的跳转

UINavigationBar:

navigationBar—导航条,iOS7之后默认是透明的,iOS7之前默认是不

透明的。 navigationBar在透明情况,与contentView会重合⼀一部分区域。

navigationBar在不透明情况,contentView跟在navigationBar的下⾯面。 navigationBar竖屏下默认⾼高度44,横屏下默认⾼高度32.

UINavigationBar除了能定义⾃自⾝身的样式外,还管理⼀一组

UINavigationItem。 与UINavigationController相似,UINavigationBar也是以栈的⽅方式管

理⼀一组UINavigationItem。提供push和pop操作item。

每个视图控制器都有⼀一个navigationItem属性。navigationItem中设 置的左按钮、右按钮、标题等,会随着控制器的显⽰示,也显⽰示到 navigationBar上;

UINavigationItem:

UINavigationItem属于MVC中的M。封装了要显⽰示在UINavigationBar上

的数据。

UIBarButtonItem属于MVC的M。定义了UINavigationItem上按钮的触

发事件,外观等

-initWithBarButtonSystemItem:target:action:

-initWithTitle:style:target:action: -initWithImage:style:target:action: tintColor;

页面传值:

一种是属性传值;

一种是代理传值;

属性传值:如果从A页面往B页面传值,在B页面中声明属性,在A页面中跳转事件中给B页面的属性赋值;

从后一个页面返回前一个页面不会执行前面页面的loadView和viewDidLoad方法,而是执行viewWillAppear方法,因为,loadView和viewDidLoad方法的作用是将视图加载到内存,而从后一个页面返回时,前一个页面已经加载到内存,所以不用再次加载,所以不执行loadView和ViewDidLoad方法;

代理传值:

和代理设计模式一样,按照设置代理,遵循协议

// push是入栈的意思  pop是出栈的意思
// 能够显示的Controller视图是位于栈顶的Controller
[self.navigationController pushViewController:firstVC animated:YES];

// 出栈,一定是从栈顶出 返回上一级  最常用
    [self.navigationController popViewControllerAnimated:YES];

// 弹出到指定ViewController
    // 到指定ViewController之前的所有Controller全部出栈
    [self.navigationController popToViewController:self.navigationController.viewControllers[0] animated:YES];

// 弹出到根视图控制器  返回首页
    // 根视图控制器前的所有控制器全部出栈
    [self.navigationController popToRootViewControllerAnimated:YES];

// 打印出navagationController栈中的所有的viewController
    NSLog(@"%@",self.navigationController.viewControllers);


ViewController.m

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
//创建一个按钮,点击后进入子视图控制器,相当于进入子页面
UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame=CGRectMake(38, 100, 300, 30);
[btn1 setTitle:@"jump to secondviewcontroller" forState:UIControlStateNormal];
btn1.backgroundColor=[UIColor whiteColor];
self.view.backgroundColor=[UIColor redColor];
[btn1 addTarget:self action:@selector(jumpTo) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
//设置导航条样式
//默认的时白色半透明(有点灰的感觉),UIBarStyleBlack,UIBarStyleBlackTranslucent,UIBarStyleBlackOpaque都是黑色半透明,其实它们有的时不透明有的时透明有的时半透明,但不知为何无效果
self.navigationController.navigationBar.barStyle=UIBarStyleDefault;
//设置导航条背景颜色,也是半透明玻璃状的颜色效果
self.navigationController.navigationBar.backgroundColor=[UIColor orangeColor];
//可以用self.navigationController.navigationBar.frame.size获得高宽,还有self.navigationController.navigationBar.frame.origin获得x和y
//高44,宽375,如果是Retina屏幕,那么宽和高@2x即可分别是750和88
//x是0很明显,y是20,其中上面20就是留给状态栏的高度
NSLog(@"%f",self.navigationController.navigationBar.frame.origin.y);

//隐藏导航条,由此点击进入其他视图时导航条也会被隐藏,默认是NO
//以下一个直接给navigationBarHidden赋值,一个调用方法,都是一样的,下面一个多了一个动画选项而已
self.navigationController.navigationBarHidden=NO;
[self.navigationController setNavigationBarHidden:NO animated:YES];
//给导航条增加背景图片,其中forBarMetrics有点类似于按钮的for state状态,即什么状态下显示
//UIBarMetricsDefault-竖屏横屏都有,横屏导航条变宽,则自动repeat图片
//UIBarMetricsCompact-竖屏没有,横屏有,相当于之前老iOS版本里地UIBarMetricsLandscapePhone
//UIBarMetricsCompactPrompt和UIBarMetricsDefaultPrompt暂时不知道用处,官方解释是Applicable only in bars with the prompt property, such as UINavigationBar and UISearchBar,以后遇到时再细说
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"big2.png"] forBarMetrics:UIBarMetricsDefault];
//如果图片太大会向上扩展侵占状态栏的位置,在状态栏下方显示
//clipsToBounds就是把多余的图片裁剪掉
self.navigationController.navigationBar.clipsToBounds=YES;

//设置导航标题
[self.navigationItem setTitle:@"主页"];

//设置导航标题视图,就是这一块可以加载任意一种视图
//视图的x和y无效,视图上下左右居中显示在标题的位置
UIView *textView1=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 50, 30)];
textView1.backgroundColor=[UIColor whiteColor];
[self.navigationItem setTitleView:textView1];

//设置导航条的左右按钮
//先实例化创建一个UIBarButtonItem,然后把这个按钮赋值给self.navigationItem.leftBarButtonItem即可
//初始化文字的按钮类型有UIBarButtonItemStylePlain和UIBarButtonItemStyleDone两种类型,区别貌似不大
UIBarButtonItem *barBtn1=[[UIBarButtonItem alloc]initWithTitle:@"左边" style:UIBarButtonItemStylePlain target:self action:@selector(changeColor)];
self.navigationItem.leftBarButtonItem=barBtn1;

//我们还可以在左边和右边加不止一个按钮,,且可以添加任意视图,以右边为例
//添加多个其实就是rightBarButtonItems属性,注意还有一个rightBarButtonItem,前者是赋予一个UIBarButtonItem对象数组,所以可以显示多个。后者被赋值一个UIBarButtonItem对象,所以只能显示一个
//显示顺序,左边:按数组顺序从左向右;右边:按数组顺序从右向左
//可以初始化成系统自带的一些barButton,比如UIBarButtonSystemItemCamera是摄像机,还有Done,Reply等等,会显示成一个icon图标
//还可以initWithImage初始化成图片
//还可以自定义,可以是任意一个UIView
UIBarButtonItem *barBtn2=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(changeColor2)];
UIBarButtonItem *barBtn3=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"logo-40@2x.png"] style:UIBarButtonItemStylePlain target:self action:@selector(changeColor3)];
UIView *view4=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 20, 20)];
view4.backgroundColor=[UIColor blackColor];
UIBarButtonItem *barBtn4=[[UIBarButtonItem alloc]initWithCustomView:view4];
NSArray *arr1=[[NSArray alloc]initWithObjects:barBtn2,barBtn3,barBtn4, nil];
self.navigationItem.rightBarButtonItems=arr1;
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

-(void)changeColor{
self.view.backgroundColor=[UIColor purpleColor];
}
-(void)changeColor2{
self.view.backgroundColor=[UIColor whiteColor];
}
-(void)changeColor3{
self.view.backgroundColor=[UIColor orangeColor];
}

-(void)jumpTo{
//这里面核心的有两个,所谓跳转,其实就是往导航控制器栈中PUSH或者POP一个视图控制器,这样在最上面的视图控制器就变了,这样视图也跟着变了,因为只显示在栈顶得那个视图控制器的视图
//所以(1)控制所谓的跳转,其实是导航控制器在控制,在里面的元素都可以通过navigationController属性获取到它们所在的导航控制器
//所以(2)获取到导航控制器之后,使用Push的那个方法,往栈里面放一个视图控制器senCon1,这个新放入的在栈顶,就显示它的视图,所以用户改变页面跳转了
SecondViewController *senCon1=[[SecondViewController alloc]init];
[self.navigationController pushViewController:senCon1 animated:YES];
}

@end


SecondViewControllor.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
UILabel *label1=[[UILabel alloc]init];
label1.frame=CGRectMake(38, 80, 300, 30);
label1.backgroundColor=[UIColor whiteColor];
label1.text=@"This is secondviewcontroller";
[self.view addSubview:label1];

UIButton *btn2=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btn2.frame=CGRectMake(38, 120, 300, 30);
[btn2 setTitle:@"backTo" forState:UIControlStateNormal];
btn2.backgroundColor=[UIColor orangeColor];
[self.view addSubview:btn2];
[btn2 addTarget:self action:@selector(backTo) forControlEvents:UIControlEventTouchUpInside];

//设置导航标题,这个时候的返回按钮的title就是上一级的navigationItem的title文字
[self.navigationItem setTitle:@"子页"];

//我们也可以在子页中自定义一个返回按钮覆盖原先的"<back"
UIBarButtonItem *barBtn5=[[UIBarButtonItem alloc]initWithTitle:@"回家" style:UIBarButtonItemStylePlain target:self action:@selector(backTo)];
self.navigationItem.leftBarButtonItem=barBtn5;

[super viewDidLoad];
// Do any additional setup after loading the view.
}

-(void)backTo{
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: