UINavigationController“戻るボタン”カスタムテキスト?
-
10-07-2019 - |
質問
「戻るボタン」 UINavigationController
のデフォルトでは、スタック内の最後のビューのタイトルが表示されます。代わりに、戻るボタンにカスタムテキストを表示する方法はありますか?
解決
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
タイラーがコメントで言ったように:
これは可視のView Controllerではなく、ビューで行います 戻るボタンを押すと表示されるコントローラー
他のヒント
Interface Builderでテキストを設定できます:
戻るボタンが戻るViewControllerのナビゲーションアイテムを選択します。
ユーティリティパネルの属性インスペクターで、戻るボタンのラベルを入力します。
受け入れられた回答のようにコードでタイトルを設定するよりも、このアプローチを好むでしょう。
また、View Controllerで1レベル上でこれを行う必要があることに注意してください スタック。言い換えれば、これを目に見えるView Controllerで行わないでください。 しかし、戻るボタンを押すと表示されるView Controllerで。
-タイラー
これを使用:
// 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でテストしました
手綱の答えに追加。 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];
これがお役に立てば幸いです!
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
}
私は何か面白いものを発見しました。
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を押す前に新しい戻るボタンを作成することを覚えておく必要はありません。
手綱の答えはうまくいきます。
複数のView Controllerをプッシュすると、変更された戻るボタンのタイトルがそれぞれに表示されることに注意してください。
その場合、View ControllerをプッシュするたびにカスタムUIBarButtonItemを作成する必要があります。
また、View Controllerをプッシュする前に 必ず実行してください。そうしないと、タイトルが変更されると画面が乱れます。
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
完全ではありません。新しいコントローラーがアニメーション化されると、親ビューのタイトルが変わります。ただし、これにより、戻るボタンにカスタムラベルを付けて、標準の戻るボタンのような形に保つという目標が達成されます。
これを viewDidLoad
に入れて、探しているものになることを期待してください
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
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を配置します。
これは古い質問であり、回答の種類が更新されていることを知っています!
簡単な方法は、親ViewControllerでこれを行うことです:
i.e次のView Controllerに移動するもの。
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
これをコードで行うと、 UINavigationConroller
の戻るボタンスタイルが削除されます。各ビューにナビゲーションアイテムを追加する場合、 StoryBoard
でバックボタンのタイトルを設定できます。