web-dev-qa-db-ja.com

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

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

146
Ali Shafai

このリンク から:

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

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

表示されているView Controllerではなく、戻るボタンを押すと表示されるView Controllerでこれを行います

340
rein

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

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

enter image description here

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

enter image description here

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

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

43
Petr Peller

私はこれを使用します:

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

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

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

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

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

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

11
Aubrey Goodman

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

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

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

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

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

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

IOS 9を搭載したiPhoneとiPadでテストしました

3
alones
- (void)viewDidLoad {
  [super viewDidLoad];

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

手綱の答えに追加します。 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];

お役に立てれば!

2
Eric Goldberg

私は何か面白いものを発見しました。 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];

次に、Navigation ControllerでプッシュされたすべてのViewControllersに対して、[戻る]ボタンが自動的に表示されます。特定のView Controllerのテキストを変更したい場合は、ViewControllerを特定のクラスまたは独自のカスタムプロトコル(ViewControllerが継承するbackButtonTextなどのメソッドを持つ可能性のあるカスタムプロトコル)にキャストすることができます)これにより、入ってくるViewControllerに関する特定の情報が得られるため、戻るボタンのテキストをカスタマイズできます。これで、戻るボタンのテキストは、責任を負うべき場所で処理されます。テキストを変更するための新しいボタンを作成するのはまずいことですが、まあまあです。

誰もこのようなことをしない理由を考えることができますか?少なくとも、ViewControllerのタイトルをいじったり、Navigation ControllerのViewControllerを押す前に新しい戻るボタンを作成することを覚えておく必要はありません。

2
Dandré

これをviewDidLoadに入れて、探しているものになることを願って

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

これは古い質問であり、回答の種類が更新されたことを知っています!

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

つまり、次のView Controllerに移動します。

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

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

0
ingconti

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

複数のView Controllerをプッシュすると、変更された戻るボタンのタイトルがそれぞれに表示されることに注意してください。

その場合、View ControllerをプッシュするたびにカスタムUIBarButtonItemを作成する必要があります。

また、必ず実行してくださいbefore View Controllerをプッシュしないと、タイトルが変更されると画面が一時停止します。

0
northernman

Aubreyの提案を拡張して、子View Controllerでこれを行うことができます。

親の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
FingerTipFun