簡體   English   中英

UINavigationController“后退按鈕”自定義文本?

[英]UINavigationController “back button” custom text?

默認情況下, UINavigationController的“后退按鈕”顯示堆棧中最后一個視圖的標題。 有沒有辦法在后退按鈕中使用自定義文本?

這個鏈接

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

正如泰勒在評論中所說:

不要在可見視圖控制器中執行此操作,而是在視圖控制器中執行此操作,如果您單擊后退按鈕

您可以在Interface Builder中設置文本:

選擇后退按鈕將返回的ViewController的導航項:

在此輸入圖像描述

在實用工具面板屬性檢查器中,輸入后退按鈕的標簽:

在此輸入圖像描述

我更喜歡這種方法而不是在接受的答案中設置代碼中的標題。

另請注意,您需要在視圖控制器的一層上方執行此操作。 換句話說,不要在可見視圖控制器中執行此操作,而是在視圖控制器中執行此操作,如果您單擊后退按鈕。
--Tyler

我用這個:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

我通過在將另一個控制器推入堆棧之前簡單地設置控制器的標題找到了一個方便的解決方案,如下所示:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

然后,確保在viewWillAppear設置原始標題,如下所示:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

這是因為在推送操作期間構造后退按鈕時UINavigationController的默認行為是使用前一個控制器的標題。

后退按鈕的標題默認為上一個視圖的標題,因此我使用的一個快速技巧是將以下代碼放在上一個視圖的.m文件中。

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

在init方法中,添加以下代碼:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

然后添加一個簡單的方法,以允許viewcontroller解雇:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

在viewDidLoad或loadView中添加以下代碼

self.navigationController.navigationBar.topItem.title = @"Custom text";

我用iOS 9在iPhone和iPad上測試過

我發現了一些有趣的東西。 如果您UINavigationController並覆蓋pushViewController:animated:方法並執行以下操作:(請記住我正在使用ARC)

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

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

然后,對於使用導航控制器推送的所有ViewControllers ,將自動在其中包含“后退”按鈕。 如果你想更改某些視圖控制器的文本,你可以嘗試將viewcontroller轉換為某個類或你自己的自定義協議(你的viewcontroller從哪個繼承可能有像backButtonText這樣的方法或類似的東西),這可以給出你在viewcontroller上的某些信息,你可以自定義它的后退按鈕文本。 現在,后退按鈕文本將在一個應該承擔責任的地方進行處理。 我不得不承認創建一個新的按鈕來改變文字糟透了,但是哦。

任何人都可以想到為什么不這樣做? 至少你不必擺弄視圖控制器標題,或者必須記住在按下導航控制器上的視圖控制器之前創建一個新的后退按鈕。

添加到韁繩的答案。 請注意Apple的文檔中backBarButtonItem的聲明是這樣的:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

因此,rein的答案會泄漏內存,因為合成的setter將retain您傳遞的實例,而這個實例永遠不會被明確釋放。 您可以使用autorelease來解決這個問題

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

或者您可以在實例中指向變量,以便稍后可以顯式釋放它:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

希望這可以幫助!

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

把它放到你的viewDidLoad ,希望它會產生你想要的東西

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

擴展Aubrey的建議,您可以在子視圖控制器中執行此操作:

創建兩個變量來存儲父級的navigationItem.title和父級的navigationItem的舊值

UINavigationItem* oldItem;
NSString* oldTitle;

viewDidLoad ,添加以下內容:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

viewWillDisappear ,添加以下內容:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

這不完美。 當新控制器被動畫化時,您將看到父視圖的標題更改。但這確​​實實現了自定義標記后退按鈕並使其形狀像標准后退按鈕的目標。

如果你想在swift 3中設置ARRIVING控制器中的標題(有時候更多邏輯..):

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

即將到來的控制器

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

通常我將self.setBackButtonNavBar放在控制器擴展中。

我知道這是一個老問題,答案有點不斷更新!

簡單的方法是在父ViewController中執行此操作:

即帶你到下一個視圖控制器的那個。

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

rein的答案很有效。

請注意,如果您推送多個視圖控制器,則會為每個視圖控制器顯示更改的后退按鈕標題,這可能不是您想要的。

在這種情況下,每次推送視圖控制器時都需要創建自定義UIBarButtonItem。

此外,請確保按下視圖控制器之前執行此操作,否則在標題更改時將出現屏幕打嗝。

在代碼中執行此操作將刪除UINavigationConroller的后退按鈕樣式。 如果在每個視圖中添加導航項,則可以在StoryBoard設置后邊框的標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM