iOS: 动态更改 backBarButtonItem 的 title

先来看一下 UIBarItem 的 title 的描述

1
2
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 中的代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//file HZViewController.m<br><br>...<br>- (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 的返回按钮,是一个动态更改返回按钮文字的不错方法。
posted @   有妄想症的猫zz  阅读(9328)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示