iOS 【UIKit-UINavigationItem 定制导航栏中元素的信息】

来源:互联网 发布:魔盒软件最新版 编辑:程序博客网 时间:2024/06/05 08:42
首先介绍几个定义:

UINavigationController —— 导航控制器(本质是UIViewController)

UINavigationBar —— 导航栏(本质是UIView)

UINavigationItem —— 包含了navigationBar(导航栏)中的所有信息(本质是NSObject)

UIBarButtonItem —— 专门用来放在 UIToolbar或者 UINavigationBars 上的特殊button(继承于UIBarItem)

UIBarItem —— (本质上是一个NSObject,是所有item的父类)


关系综述:

navigationController直接控制viewControllers,然后包含的navigationBar形成整个navigationController的导航栏,bar并包含整个navigationItem的栈,管理整个navigationControllernavigationItemNSArray *items 属性)。

navigationItem包含了bar视图的全部元素(如title,tileview,backBarButtonItem等),受当前viewController管理,即bar形成整个navigationController的导航视图,然后每个navigationController页面的导航栏元素由所在页面的navigationItem管理。即设置当前页面的左右barButton,用self.navigationItem.leftBarButtonItem等。


我们主要介绍UINavigationItem,也就是定制导航栏中元素的信息。

在设置的时候,我们可能碰到过这样的问题:

★self.navigationItem 和 self.navigationController.navigationItem 究竟是什么区别呢?

显然我们常用的 self.navigationItem  是定制当前view导航栏。根据当前的资料看,self.navigationController.navigationItem 是应该被忽视的属性,navigationController 继承自viewController,所以会有这个属性,但没有任何作用。


我们写三个navigationController来展示一下。

首先我们创建三个类,分别继承自ViewController,创建的同时将xib也建好。


附上三个navigationController的源代码:

1、

////  OneViewController.m//#import "OneViewController.h"#import "TwoViewController.h"@interface OneViewController ()- (IBAction)jumpToTwoViewController:(id)sender;@end@implementation OneViewController- (void)viewDidLoad {    [super viewDidLoad];    //设置标题    self.navigationItem.title = @"OneViewController";        //设置导航栏左边的按钮    UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];        self.navigationItem.leftBarButtonItem = leftBtn;    //    特别注意!!!!!//    ★backBarButtonItem和leftBarButtonItem的设置是不同的,leftBarButtonItem是设置的当前的NavigationController,而backBarButtonItem是设置的下一个页面的navigationController。//    ★例如A push 到 B,在A中设置backBarButtonItem是设置了B的navigationController的leftBarbuttonItem。        //设置下一个控制器的返回按钮(当前控制器的返回按钮是由上一个控制器的navigationItem来决定的,也就是设置当前控制器的返回按钮的时候要在其上一个控制器中去设置)    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"return" style:UIBarButtonItemStylePlain target:nil action:nil];}- (IBAction)jumpToTwoViewController:(id)sender {    TwoViewController *twoVC = [[TwoViewController alloc] init];        [self.navigationController pushViewController:twoVC animated:YES];}@end


2、

////  TwoViewController.m//#import "TwoViewController.h"#import "ThreeViewController.h"@interface TwoViewController ()- (IBAction)backToTwoViewController:(id)sender;- (IBAction)jumpToThreeViewController:(id)sender;@end@implementation TwoViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.        //设置标题    self.navigationItem.title = @"TwoViewController";//    //设置返回按钮(下一个控制器的返回按钮)//    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"BACK" style:UIBarButtonItemStylePlain target:nil action:nil];        //设置左边按钮。 一旦设置了leftBarButtonItem,那么之前我们在 上一个navigationController(也就是OneViewController) 中设置的backBarButtonItem就被覆盖掉了、无效了。(原因已经解释过)    //所以这个时候我们要注意的是,之前是有返回的功能的,但是覆盖掉了之后就要再添加上原来覆盖之前按钮的功能    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(back)];        //设置右边的按钮    UIBarButtonItem *search = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:nil action:nil];    //    self.navigationItem.rightBarButtonItem = search;        //如果在右边想要设置多个按钮的话可以这么去做(调用rigthBarButtonItems属性,然后以数组的形式为其赋值)    //    我们可以看出leftBarButtonItems和rightBarButtonItems这两个参数是这样定义的!//    @property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);//    @property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);        //再初始化一个按钮    UIBarButtonItem *reply = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:nil action:nil];        self.navigationItem.rightBarButtonItems = @[search,reply];}- (void)back{    [self.navigationController popViewControllerAnimated:YES];}- (IBAction)backToTwoViewController:(id)sender{//    返回上一个控制器,这里进行的操作是将当前控制器(twoVC)移除。twoVC移除了,自然oneVC就露出来了。    [self.navigationController popToRootViewControllerAnimated:YES];}- (IBAction)jumpToThreeViewController:(id)sender{//    跳转到threeVC    ThreeViewController *threeVC = [[ThreeViewController alloc] init];    [self.navigationController pushViewController:threeVC animated:YES];}@end


3、

////  ThreeViewController.m//#import "ThreeViewController.h"@interface ThreeViewController ()- (IBAction)backToOneViewController:(id)sender;@end@implementation ThreeViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.    //    打印出当前栈中的所有控制器//    NSLog(@"viewControllers = %@",self.navigationController.viewControllers);//    //    NSArray *arrayN1 = [self.navigationController childViewControllers];//    //    NSLog(@"arrayN1 = %@",arrayN1);//    //    NSArray *arrayN2 = self.navigationController.childViewControllers;//    //    NSLog(@"arrayN2 = %@",arrayN2);    //    输出结果都是一样的//viewControllers = (//                                                                                        "<OneViewController: 0x7f98c0f2e0b0>",//                                                                                        "<TwoViewController: 0x7f98c0c3f500>",//                                                                                        "<ThreeViewController: 0x7f98c0eef330>"//  )    //arrayN1 = (//                                                                                "<OneViewController: 0x7f98c0f2e0b0>",//                                                                                "<TwoViewController: 0x7f98c0c3f500>",//                                                                                "<ThreeViewController: 0x7f98c0eef330>"//  )    //arrayN2 = (//                                                                                "<OneViewController: 0x7f98c0f2e0b0>",//                                                                                "<TwoViewController: 0x7f98c0c3f500>",//                                                                                "<ThreeViewController: 0x7f98c0eef330>"//  )    //    设置titleView    self.navigationItem.titleView = [UIButton buttonWithType:UIButtonTypeInfoDark];    //    自定义返回按钮(设置自定义按钮图片)//    先创建一个Button,在Button上设置图片    UIButton *redBtn = [UIButton buttonWithType:UIButtonTypeCustom];    [redBtn setBackgroundImage:[UIImage imageNamed:@"btn_back_normal"] forState:UIControlStateNormal];//    设置Button的bounds,不然是无法正常显示的(这里是设置Button的,而不是设置barButtonItem的)    redBtn.bounds = CGRectMake(0, 0, 46, 31);    //    为Button添加监听方法    [redBtn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpOutside];    //    将设置好的Button赋值给初始化好的barButtonItem    UIBarButtonItem *redBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:redBtn];    //    UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_back_selected"] style:UIBarButtonItemStylePlain target:self action:@selector(back)];        self.navigationItem.leftBarButtonItem = redBackButtonItem;}- (void)back{    [self.navigationController popViewControllerAnimated:YES];}- (IBAction)backToOneViewController:(id)sender {//    跳到oneVC(这里的操作我们可以将其成为返回指定的控制器)//    ①获取指定UIViewController-----oneVC    UIViewController *oneVC = self.navigationController.viewControllers[0];//    ②跳转到oneVC    [self.navigationController popToViewController:oneVC animated:YES];}@end




3 0
原创粉丝点击