先來看一下 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 上的文字能夠改變:
- 重新初始化一個 barBarButtonItem,並把原來的替換掉;
- 更改上一個 viewController 的 title;
- 直接修改上一個 viewController 的 backBarButton 的 title。
- 以上幾種情況都是在上一個 viewController 沒有初始化一個屬於自己的 backBarButtonItem 的情況下進行的。
只需要不斷的點擊“Push”按鈕,觀察返回按鈕的文字就好了。
得到的結果:
方案1:可以動態更改返回按鈕的標題,並且再次返回上一級,標題如初;
方案2:可以動態更改返回按鈕的標題,但是更改后,再次返回上一級,標題也被改掉了,和返回按鈕上的文字一樣了,這樣可不行,為了保證和方案1一樣的效果,恐怕需要一個變量來保持原來的title,並在必要時還原回去;
方案3:不能改變返回按鈕的標題
接下來,在 viewDidLoad 方法中,去掉代碼上的注釋,為當前的 viewController 初始化一個 backBarButtonItem,重復上面的測試,得到的結果是:
方案1:依然可以更改返回按鈕上的標題,並且返回上一級時,標題如初;
方案2:不能動態更改返回按鈕的標題
方案3:依然不可以更改返回按鈕的標題
#結論:
- 如果已經初始化好一個 viewController 的 backBarButtonItem,那么更改 viewController 的 title, 是起不到更改返回按鈕文字的目的的;
- 重新賦值一個 viewController 的返回按鈕,是一個動態更改返回按鈕文字的不錯方法。
