1. 一般情況下的導航欄跳轉,當在一級界面跳轉到二級界面的時候,左item的會出現 “返回箭頭+一級導航欄的標題”;
比如說:一級導航欄是“白菜精華”,那么二級導航欄的返回鍵是 :
2. 當我們使用下方的代碼(下方代碼是在一級界面寫)時,確實可以當跳轉到二級界面的時候,左上角是“返回圖標 + 返回”;
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
但是 當二級界面 push 到三級界面的時候,還是需要上方的代碼寫在二級界面中。當項目有10個以上的界面,看着就會很臃腫。所以,可以攔截 導航欄的push方法。在這個方法中進行統一的修改。
3. 自定義導航控制器,重寫它的push方法
3.1 創建“WYNavigationController:UINavigationController” , 在.m 方法中寫 :
/** * 可以在這個方法中攔截所有push進來的控制器 */ - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { [super pushViewController:viewController animated:NO]; // target 傳空也會有一個默認的點擊 方法可以用來返回到上一個界面 viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil]; }
3.2 使用上列方法給返回按鈕修改文字顏色的時候會出現,只能設置普通文字顏色,不能設置點擊的時候的文字顏色:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 返回文字顏色修改 self.navigationBar.tintColor = [UIColor blueColor]; }
所以,返回按鈕的顏色修改,不是使用的 3.1 的方法設置的。而是使用UIButton的。
寫法如下:
/** * 可以在這個方法中攔截所有push進來的控制器 */ - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { if (self.childViewControllers.count > 0) { // 如果push進來的不是第一個控制器 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setTitle:@"返回" forState:UIControlStateNormal]; [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted]; button.size = CGSizeMake(70, 30); // 讓按鈕內部的所有內容左對齊 button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; // [button sizeToFit]; // 讓按鈕的內容往左邊偏移10 button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0); [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; // 隱藏tabbar viewController.hidesBottomBarWhenPushed = YES; } // 這句super的push要放在后面, 讓viewController可以覆蓋上面設置的leftBarButtonItem [super pushViewController:viewController animated:animated]; } - (void)back { [self popViewControllerAnimated:YES]; }
導航控制器補充1:
/** * 可以在這個方法中攔截所有push進來的控制器 */ - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { // 當 animated 為 NO 的時候,就代表所有push進來的導航控制器都沒有動畫效果。 [super pushViewController:viewController animated:NO]; }