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