2013-08-26 42 views
10

我想爲UINavigationController堆棧中推送的VC組設置BACK按鈕。我使用下面的代碼,但它不工作 - 我仍然會將以前的VC名稱顯示爲後退按鈕標題。iOS >> UINavigation項後退按鈕標題不會更改

-(void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    self.title = @"VC Title"; 

    UIBarButtonItem* myBackButton = [[UIBarButtonItem alloc] 
            initWithTitle:@"Back" 
            style:UIBarButtonItemStyleBordered 
            target:nil 
            action:nil]; 

    self.navigationItem.backBarButtonItem = myBackButton; 

} 

有人嗎?

回答

16

嘗試設置標題父視圖控制器的viewDidLoad

UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(popView)]; 

self.navigationItem.leftBarButtonItem = customBarItem; 
+3

感謝chris13。那樣做了。奇怪的是,雖然self.navigationItem與下一個VC相關,而不是與當前活動的VC有關......任何想法爲什麼或者你有一個關於它的好的解釋的鏈接? –

+1

我也覺得這很奇怪,但蘋果Docs使它更清晰一些..請接受答案,如果它幫助你;) – chris13

+4

這不適用於iOS 7. – zgjie

12

從蘋果公司的文檔:

導航欄左側的欄按鈕項目允許導航回到以前的視圖控制器在導航堆棧上。導航控制器按如下方式更新導航欄的左側:

如果新的頂層視圖控制器具有自定義左欄按鈕項目,則會顯示該項目。要指定自定義左欄按鈕項目,請設置視圖控制器導航項目的leftBarButtonItem屬性。

如果頂級視圖控制器沒有自定義左欄按鈕項目,但前一個視圖控制器的導航項目在其backBarButtonItem屬性中具有有效項目,則導航欄會顯示該項目。

如果任一視圖控制器未指定自定義欄按鈕項目,則會使用默認後退按鈕並將其標題設置爲前一視圖控制器的title屬性的值 - 即視圖控制器一個級別在堆棧上。 (如果導航堆棧上只有一個視圖控制器,則不顯示後退按鈕。)

希望這有助於您。

+0

謝謝johnyu。但是,如果我將第一個選項設置爲navigationItem.leftBarButtonItem,那麼它沒有默認的後退按鈕「箭頭」形狀外觀。任何想法如何解決? –

+0

+1此處是鏈接:更新導航欄https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006934- CH3-SW25 – situee

+0

謝謝!最後,我設法將我想要的行爲提供給我的後退按鈕。 –

17
在父視圖控制器

- (void)viewWillDisappear:(BOOL)animated 
{ 
    self.title = @"Back"; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    self.title = @"Title of your navigation bar"; 
} 

會做的伎倆

+0

有趣的把戲,但它的作品! :) – NightFury

+0

天才!謝謝! –

+0

高超技巧...智能編碼器.. –

3
self.navigationItem.hidesBackButton = YES; 
self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc] initWithTitle:@"Put Any Title" 
             style:UIBarButtonItemStyleBordered 
            target:nil 
            action:nil]; 
0

另一個解決方案,它非常快速。

在您的基本視圖控制器中重寫此方法,並且您將在每個推送的視圖控制器上都有後退按鈕。對於情節串連圖板解決方案(只是不添加[super setTitle:title]

- (void)setTitle:(NSString *)title 
{ 
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)]; 
    [lbl setText:title]; 
    [lbl setTextColor:[UIColor whiteColor]]; 
    [self.navigationItem setTitleView:lbl]; 
} 
0

;

點擊前一個視圖控制器的導航項。然後單擊右窗格上的屬性檢查器,然後在「後退」區域中寫入「」或其他任何內容。這會告訴視圖控制器在下一個(子視圖)控制器中顯示的內容。希望它有幫助

代碼解決方案;

UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithTitle:@"back off" style:UIBarButtonItemStyleBordered target:self action:@selector(popView)]; 
[[self navigationItem] setBackBarButtonItem:customBarItem]; 
0

你可以使用這個(的viewController中顯示後退按鈕)

UINavigationController *nvc = self.navigationController; 
NSInteger currentViewControllerIndex = [nvc.viewControllers indexOfObject:self]; 

if (currentViewControllerIndex > 0) { 
    UIViewController *previousViewController = self.navigationController.viewControllers[currentViewControllerIndex - 1]; 
    previousViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backButtonTitle style:UIBarButtonItemStylePlain target:nil action:nil]; 
} 

在迅速

if let currentViewControllerIndex = self.navigationController?.viewControllers.indexOf(self) where currentViewControllerIndex > 0, 
    let previousViewController = self.navigationController?.viewControllers[currentViewControllerIndex - 1] { 
     previousViewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: backButtonTitle, style: .Plain, target: nil, action: nil) 
} 
相關問題