UINavigationControllerの「戻るボタン」カスタムテキスト?


147

UINavigationControllerデフォルトの「戻るボタン」は、スタックの最後のビューのタイトルを示します。代わりに、戻るボタンにカスタムテキストを含める方法はありますか?


1
この作業は私にとってself.navigationController.navigationBar.topItem.title = @"Custom text";
huync 2017

回答:


342

このリンクから:

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

タイラーがコメントで言ったように:

表示されているビューコントローラーではこれを行わないでください。ただし、戻るボタンを押した場合に表示されるビューコントローラーでは、


4
あなたがする必要がreleaseありUIBarButtonItemます。
Mehrdad Afshari、

217
また、スタックの1レベル上のView Controllerでこれを行う必要があることに注意してください。言い換えると、表示されているビューコントローラーではこれを行わず、戻るボタンを押したときに表示されるビューコントローラーでこれを行います。
タイラー

6
最初はこれを理解していなかったため、タイラーのコメントを明確にするために:ビューコントローラーでのbackBarButtonItemの設定navigationItemは、このビューコントローラーに戻るために表示されるボタンを設定しています。また、矢印ボタンのボタンスタイルはありませんが、このボタンはとにかく矢印スタイルを取得します。UIBarButtonItemStylePlainを使用していても、矢印ボタンのスタイルを取得しています。
Jon Steinmetz

3
提案:スタイルを想定するのではなく、現在設定されているスタイルを渡します。この回答のコードでUIBarButtonItemStyleBordered、プロパティの呼び出しに置き換えますself.navigationItem.backBarButtonItem.style。ドキュメント:developer.apple.com/library/ios/documentation/uikit/reference/...
バジルボーク

1
ARCでは、自動解放呼び出しを省略しなければならないことに注意してください。したがって、self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@ "Custom Title" style:UIBarButtonItemStyleBordered target:nil action:nil];
bkbeachlabs 14

43

Interface Builderでテキストを設定できます。

戻るボタンが戻るViewControllerのナビゲーション項目を選択します。

ここに画像の説明を入力してください

ユーティリティパネルの属性インスペクタで、[戻る]ボタンのラベルを入力します。

ここに画像の説明を入力してください

私は、受け入れられた回答のようにコードでタイトルを設定するよりもこのアプローチを好みます。

また、スタックの1レベル上のView Controllerでこれを行う必要があることに注意してください。つまり、表示されているビューコントローラではこれを行わず、戻るボタンを押したときに表示されるビューコントローラでこれを行います。
-タイラー


これは私がこれまでに見つけた最良の答えです。
Ayan Sengupta 2014年

2
明確にするために、これはビューコントローラーの属性インスペクター自体ではなく、ビューコントローラーのナビゲーションアイテムで設定する必要があります。
Patrickが

これが私が見つけた最良の答えです。
bicepjai 14

これが最良の答えです
Alex Brown

2
Xcode 6.1.1以降、iOS 7で実行している場合、元の以前のビュータイトルは、ここで設定した[戻る]ボタンのタイトルを上書きします。前のビューのタイトルに11文字を超える文字が含まれている場合、次のビューの戻るボタンは単に「戻る」と表示されます。ここでトップ投票された回答に示されているように、最初から新しいナビゲーションバーアイテムを作成する以外に方法はありません。
レイ

22

私はこれを使います:

// 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";
}

これはほとんど問題なく動作しますが、[戻る]ボタンをクリックすると、アニメーションの期間中、テキストが親のタイトルに戻ります:-(
Danny Tuppeny

3
これにより、コントローラの[戻る]ボタンのタイトルがスタック内で上に移動します。現在表示されているコントローラーの[戻る]ボタンのタイトルは変更されません。さらに悪いことに、コントローラのタイトルが以前のコントローラに変更されます!
リバイアサン2010

他のコメンターが指摘しているように、この方法は少し面倒です。これは、APIがユーザーに使用することを意図している方法ではないため、これを行うことはお勧めしません。あなたは将来、難しいバグに備えているかもしれません!
RickDT 2012年

11

次のように、別のコントローラーをスタックにプッシュする前にコントローラーのタイトルを設定するだけで、これに対する便利な解決策が見つかりました。

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

次に、元のタイトルを次のように設定してviewWillAppearください。

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

これUINavigationControllerは、プッシュ操作中に戻るボタンを作成するときのデフォルトの動作が、前のコントローラーのタイトルを使用するためです。


1
これの問題は、古いビューのタイトルがアニメートして少し問題があるように見えることです。ここで与えられた解決策はどれもあなたが望むように機能しないようです:-(
Danny Tuppeny

1
前の画面にNavBarを表示せず、新しい画面の戻るボタンからtitleLabelを削除して、iOS7の山形矢印だけを表示したいので、これは私の状況では完璧です。したがって、タイトルに空のNSStringリテラルを設定できます。
siburb 2013年

ビューコントローラーを押すと、後ろをタップすると例外が発生します
Sumit

7

戻るボタンのタイトルはデフォルトで前のビューのタイトルになっているので、私が使用する簡単なトリックは、次のコードを前のビューの.mファイルに配置することです。

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

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

これは多くの場合非常にうまく機能し、非常に単純です。唯一の観察は、これらのメソッドのいずれかをオーバーライドするには、新しいメソッドのある時点でスーパーの実装を呼び出す必要があるということです。
izk

2
この方法では、プッシュアニメーションが発生する前に、親ビューのタイトルが「戻る」に変更されていることに気づくでしょう。(そして、なんとなく、これをviewDidDisappearメソッドに移動すると、プッシュ後にスイッチが発生することがわかります。)
James Boutcher

私はこの方法が大好きですが、私がこれに直面する問題は、「元のタイトル」が正しく設定されることですが、「戻る」よりも長い場合は省略記号が付いています。これは、ビューがまだビュー階層にないためです。 、タイトルビューを再レイアウトしません。上記の@JamesBoutcherで説明されている問題は、アニメーションの初期速度が速いため、私には気づかれません。実際、私が直面している問題は、この問題が顕著であるときの遅いエンディングアニメーションのために特に顕著であることを認識しました。
trss 2014年

stackoverflow.com/questions/1441699/…での回答は必要以上にカスタマイズされているように感じられますが、それは文書化された方法であり、より重要なことに、私たちの意図により一致しているようです。
trss 2014年

6

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];  
}

3

次のコードをviewDidLoadまたはloadViewに追加します。

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

iOS 9を搭載したiPhoneおよびiPadでテストしました


self.navigationController?.navigationBar.backItem?.title = "Custom Text"
Peacemoon

1
私が必要とした唯一の違いは、navigationControllerおよびtopItemプロパティのオプションのチェーンでした。例:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

手綱の答えに追加します。Appleのドキュメントから、backBarButtonItemの宣言は次のとおりであることに注意してください。

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

したがって、合成されたセッターは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];

お役に立てれば!


最近では、ARCを使用すると、自動解放について心配する必要はありません(ARCが有効なプロジェクトで自動解放しようとすると、コンパイラーはエラーになります)
Eric Goldberg

2
- (void)viewDidLoad {
  [super viewDidLoad];

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

2

面白いものを発見しました。をサブクラス化しUINavigationControllerpushViewController:animated:メソッドをオーバーライドし、次のようなことを行った場合:(私はARCを使用していることに注意してください)

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

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

次にViewControllers、ナビゲーションコントローラーで押されたものすべてに、自動的に「戻る」ボタンが表示されます。特定のView Controllerのテキストを変更したい場合は、試してみて、ViewControllerを特定のクラスまたは独自のカスタムプロトコルにキャストすることができます(ViewControllerが継承するメソッドは、backButtonTextできます入ってくるビューコントローラーに関する特定の情報。これにより、戻るボタンのテキストをカスタマイズできます。これで、戻るボタンのテキストは、責任を単独で負うべき場所で処理されます。テキストを変更するための新しいボタンを作成するのは面倒ですが、まあ。

誰もがこのようにしない理由を考えることができますか?少なくとも、ビューコントローラのタイトルをいじったり、ナビゲーションコントローラのビューコントローラを押す前に新しい戻るボタンを作成することを忘れたりする必要はありません。


0

手綱の答えはうまくいきます。

複数のビューコントローラーを押すと、変更された戻るボタンのタイトルがそれぞれに表示されます。

その場合は、ビューコントローラーをプッシュするたびにカスタムUIBarButtonItemを作成する必要があります。

また、View Controllerをプッシュする前に必ず実行してください。そうしないと、タイトルが変わると画面が乱れます。


0

オーブリーの提案を拡張して、これを子ビューコントローラーで行うことができます:

親のnavigationItem.titleと親のnavigationItemの古い値を格納するための2つの変数を作成します

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

それは完璧ではありません。新しいコントローラーがアニメーション化されると、親ビューのタイトルが変更されます。しかし、これにより、戻るボタンにカスタムラベルを付け、標準の戻るボタンのような形に保つという目的が達成されます。


0

これをあなたviewDidLoadに入れてください、あなたが探しているものになることを願っています

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

0

ARRIVINGコントローラでタイトルを設定する場合(場合によってはより多くのロジック..)Swift 3で:

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を配置します。


0

これは古い質問であり、回答は更新されています。

簡単な方法は、これを親ViewControllerで行うことです。

つまり、次のビューコントローラに移動するものです。

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

-1

コードでこれを行うと、の[戻る]ボタンのスタイルが削除されますUINavigationConroller。各ビューにナビゲーションアイテムを追加すると、でバックボタンのタイトルを設定できますStoryBoard

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.