UI基础学习之(十二):UINavigationController

本文详细介绍了UINavigationController的功能和用法,包括其如何管理视图控制器的层级关系,如何通过push和pop方法实现视图间的切换,以及如何定制导航栏的样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UINavigationController

导航视图控制器,用来管理多个视图控制器,主要管理有层级关系的控制器。

 

UINavigationController继承于UIViewController,以栈的方式管理所控制的视图控制器,控制出栈和入栈来展示各个视图控制器。至少要有一个被管理的视图控制器,这个控制器我们称作,导航视图控制器的根视图控制器。

任何继承自UIViewController的类都可以作为根视图控制器。

 

UINavigationController的ContentView里始终显示栈顶控制器的View。

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

通过navigationController属性(父类中的属性),每个在栈中的控制器,都能通过此属性,获取自己所在的UINavigationController对象,并进行push和pop。

 

pushViewController:<#(UIViewController*)#> animated:<#(BOOL)#>

进入下一个视图控制器,(将视图控制器拖入栈中)

 

popViewControllerAnimated:<#(BOOL)#>

返回上一个视图控制器

 

popToRootViewControllerAnimated:<#(BOOL)#>

返回到根视图控制器

 

popToViewController:<#(UIViewController*)#> animated:<#(BOOL)#>

返回到指定的视图控制器,栈中的视图控制器存储结构为数组,需要使用数组接收栈中的视图。

 

使用viewControllers属性,得到栈中的全部数组,index从0开始,设置指定视图的index后传入。

UIViewController * vc =self.navigationController.viewControllers[0];

[self.navigationController  popToViewController:vc animated:YES];

 

 

 

出栈 pop 显示的视图并未出栈

 

可以接收视图,不接收的视图直接销毁,下次进入时重新创建。

只pop出栈顶的视图控制器

[self.navigationController  popViewControllerAnimated:YES];

 

出栈 pop到指定的视图控制器ViewController

UIViewController * vc =self.navigationController.viewControllers[0];

[self.navigationController popToViewController:vc animated:YES];

 

 

出栈 pop到栈底位置

[self.navigationController  popToRootViewControllerAnimated:YES];

 

常用属性:

viewControllers    //所有处于栈中的控制器

topViewController  //位于栈顶的控制器

visibleViewController //当前正在显⽰示的控制器

 

栈中的控制器(数组中顺序是按照入栈的顺序存储的)

NSLog(@"%@", self.navigationController.viewControllers);

 

栈顶视图控制器

NSLog(@"%@", self.navigationController.topViewController);

 

正在显示的视图控制器,一般来说是栈顶的视图控制器,但模态出来的视图控制器不入栈(正在显示,不位于栈顶)

NSLog(@"%@",self.navigationController.visibleViewController);

 

 

 

UINavigationBar 导航条

 

barTintColor   //设置导航条的颜色

setBackgroundImage:  forBarMetrics:  //导航条加背景图片

 

设置  statueBar

竖屏:高度44 +statusBar 20

横屏:高度32

 

RootViewController * rootView = [[RootViewController alloc]init];   

UINavigationController * rootNC = [[UINavigationController alloc]initWithRootViewController:rootView];

      

设置颜色

rootNC.navigationBar.barTintColor = [UIColor greenColor];

[rootNC.navigationBar setBackgroundImage:[UIImageimageNamed:@"01.png"] forBarMetrics:UIBarMetricsDefault];

   

self.window.rootViewController = rootNC;

 

 

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

 

与UINavigationController相似,UINavigationBar也是以栈的方式管理一组UINavigationItem。提供push和pop操作item。每个视图控制器都有一个navigationItem属性。

 

navigationItem中设置的左按钮、右按钮、标题等,会随着控制器的显示,也显示到navigationBar上。

UINavigationItem属于MVC中的M。封装了要显示在UINavigationBar上的数据。定义了UINavigationItem上按钮的触发事件,外观等。

 

title //标题

self.navigationItem.title = @"今日头条";

 

titleView //标题视图也可以添加label、button等View。

UITextField * textField = [[[UITextField alloc] init] autorelease];

textField.frame = CGRectMake(0, 0, 150, 34);

textField.borderStyle = UITextBorderStyleRoundedRect;

self.navigationItem.titleView = textField;

 

创建按钮使用的方法:

-initWithBarButtonSystemItem: target:  action:

 

-initWithTitle:  style:  target: action:

 

-initWithImage:  style:  target: action:

 

tintColor// 按钮上文字显示的颜色

 

 

leftBarButtonItem //左按钮

当创建一个leftBarButton,会自动取代系统默认的backButton

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:selfaction:@selector(leftAction:)];

 

rightBarButtonItem //右按钮

 

UIBarButtonItem * bi1 = [[UIBarButtonItem alloc]initWithTitle:@"确定" style:UIBarButtonItemStyleDone target:selfaction:@selector(bi1Action:)];

bi1.tintColor = [UIColor greenColor];

   

UIBarButtonItem * bi2 = [[UIBarButtonItem alloc]initWithTitle:@"好的" style:UIBarButtonItemStyleDone target:selfaction:@selector(bi2Action:)];

bi2.tintColor = [UIColor cyanColor];

   

self.navigationItem.rightBarButtonItems = @[bi2, bi1];

 

 

隐藏navigationBar会全部页面隐藏

self.navigationController.navigationBarHidden = YES;

添加隐藏时的动画

[self.navigationController setNavigationBarHidden:NO animated:YES];

 

UINavigationController的基类问题

创建时可以设置基类,设定基本的布局,其他的ViewController继承基类,完成初步的布局,不用单独设置。基类中的方法也能继承过去。                                                


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值