• iOS: 动态更改 backBarButtonItem 的 title


    先来看一下 UIBarItem 的 title 的描述

    The title displayed on the item.
    You should set this property before adding the item to a bar. The default value is nil.

    它的默认值为nil,你应该在把 item 添加到 bar 上前设置好它。

    我们都知道,当我们 push 一个 viewController 后,返回 item 上的 title 正是上一个 viewController 的title;

    而且当 viewController 的 title 改变时,item 的 title 也会跟着改变。

    大胆猜测一下,如果 item 的 title 为 nil,那么当它的值就跟它的 viewController 的title 绑定到了一起。

    #注意:虽然这个返回按钮显示在当前这个 ViewController,不过它可是属于上一个 ViewController。

    做个小测验:

    项目结构图:

    项目结构图

    在 ViewController 中的代码片段:

    //file HZViewController.m

    ...
    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.title = [NSString stringWithFormat:@"Title %i", self.navigationController.viewControllers.count]; /* UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:@"Back#%i", self.navigationController.viewControllers.count] style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backButtonItem; */ } - (IBAction)pushNewViewController:(id)sender { if (self.navigationController.viewControllers.count < 2) { HZViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:NSStringFromClass(self.class)]; [self.navigationController pushViewController:controller animated:YES]; }else{ HZViewController *viewController = [self.navigationController.viewControllers objectAtIndex:0]; static NSUInteger count = 0; count ++; //1 /* UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:@"Back#%i", count] style:UIBarButtonItemStylePlain target:nil action:nil]; viewController.navigationItem.backBarButtonItem = backButtonItem; */ //2 /* viewController.title = [NSString stringWithFormat:@"%i", count];*/ //3 [viewController.navigationItem.backBarButtonItem setTitle:[NSString stringWithFormat:@"%i", count]]; } }

     说明一下,pushNewViewController 方法绑定的是 push 按钮,里面有一个 if 判断,如果当前 viewController 是 navigationController 的 rootViewController, 则再 push 进一个 viewController,否则,停止 push,开始测试什么情况下,backBarButtonItem 上的文字能够改变:

    1. 重新初始化一个 barBarButtonItem,并把原来的替换掉;
    2. 更改上一个 viewController 的 title;
    3. 直接修改上一个 viewController 的 backBarButton 的 title。
    4. 以上几种情况都是在上一个 viewController 没有初始化一个属于自己的 backBarButtonItem 的情况下进行的。

    只需要不断的点击“Push”按钮,观察返回按钮的文字就好了。

    得到的结果:

    方案1:可以动态更改返回按钮的标题,并且再次返回上一级,标题如初;

    方案2:可以动态更改返回按钮的标题,但是更改后,再次返回上一级,标题也被改掉了,和返回按钮上的文字一样了,这样可不行,为了保证和方案1一样的效果,恐怕需要一个变量来保持原来的title,并在必要时还原回去;

    方案3:不能改变返回按钮的标题

    接下来,在 viewDidLoad 方法中,去掉代码上的注释,为当前的 viewController 初始化一个 backBarButtonItem,重复上面的测试,得到的结果是:

    方案1:依然可以更改返回按钮上的标题,并且返回上一级时,标题如初;

    方案2:不能动态更改返回按钮的标题

    方案3:依然不可以更改返回按钮的标题

    #结论:

    1. 如果已经初始化好一个 viewController 的 backBarButtonItem,那么更改 viewController 的 title, 是起不到更改返回按钮文字的目的的;
    2. 重新赋值一个 viewController 的返回按钮,是一个动态更改返回按钮文字的不错方法。
  • 相关阅读:
    人生应该接受的教育
    【转】俞军给淘宝产品经理的分享
    【转】伪O2O已死?2016年实体零售将迎来真正的O2O
    【转】一个测试工程师的2015总结和2016年小展望
    【转】移动App测试中的最佳做法
    Net作业调度(一) -Quartz.Net入门
    Quartz学习
    Newtonsoft.Json.dll
    用C#实现Base64处理,加密解密,编码解码
    mysql 连接数的最大数
  • 原文地址:https://www.cnblogs.com/ihojin/p/change-backbarbuttonitem-text.html
Copyright © 2020-2023  润新知