回答:
これは、「NewTitle」というタイトルのViewControllerを呼び出すメソッドに配置する必要があります。pushまたはpopViewControllerステートメントの直前。
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"NewTitle"
style:UIBarButtonItemStyleBordered
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
-viewDidLoad:
ChildVCではこれは私のために働きました...
self.navigationController.navigationBar.topItem.title = @"Back";
Swiftでも動作します!
self.navigationController!.navigationBar.topItem!.title = "Back"
これがbackBarButtonItemのドキュメントです:
「このナビゲーションアイテムがスタックの一番上のアイテムのすぐ下にある場合、ナビゲーションコントローラーはこのナビゲーションアイテムからナビゲーションバーの戻るボタンを生成します。[...]戻るボタンのカスタム画像またはタイトルを指定する場合代わりに、このプロパティにカスタムバーボタンアイテム(カスタムタイトルまたは画像付き)を割り当てることができます。」
View Controller A(「親」 View Controller ):
self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
他のビューコントローラBがナビゲーションスタックの一番上にあり、Aがそのすぐ下にある場合、Bの戻るボタンのタイトルは"Short"になります。
Xcode 4.5でストーリーボードを使用して、[戻る]ボタンの値を動的に変更する必要がない場合に私が見つけた最も簡単な解決策は、目的のビューコントローラーのナビゲーション項目に関連付けられた[戻るボタン]フィールドを使用することです。 「戻る」ボタンで他のことを言ってほしい。
たとえば、下のスクリーンショットでは、押したビューコントローラーの[戻る]ボタンに、[戻る]ボタンのタイトルとして[戻る]を付けたいと考えています。
もちろん、毎回少しずつ違うものを言うために戻るボタンが必要な場合、これは機能しません…そのための他のすべての解決策があります。
質問は非常に古いですが、良い解決策を見つけました。
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
childViewから機能します!iOS 7でテスト済み。
多分私は単純化しすぎているかもしれませんが、Appleのドキュメントからの表現は次のとおりです。
カスタムバーボタン項目がいずれかのビューコントローラーで指定されていない場合、デフォルトの戻るボタンが使用され、そのタイトルは前のビューコントローラーのタイトルプロパティの値に設定されます。つまり、1レベル下のビューコントローラースタック。
上記で正しいとマークされたソリューションは、親コントローラーからデフォルトのボタン項目を設定します。それは正しい答えですがself.title
、新しいコントローラーをNavigationControllerスタックにプッシュする直前にUIViewControllerのプロパティを変更することで問題を解決しています。
これにより、次のコントローラーの戻るボタンのタイトルが自動的に更新されます。また、本来あるself.title
べき状態に戻している限り、viewWillAppear
このメソッドが原因で問題が多すぎることはありません。
これは私にとってより効果的です。試してください:
self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Swift / iOS8では、以下が機能しました:
let backButton = UIBarButtonItem(
title: "Back Button Text",
style: UIBarButtonItemStyle.Bordered,
target: nil,
action: nil
);
self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;
フェリペの答えから移植されました。
self.navigationController?.navigationBar.topItem?.backBarButtonItem
はい、こちらです。「最初」のビューコントローラがあり、ボタンなどを押して別のビューコントローラを「2番目」にナビゲートする場合、いくつかの作業を行う必要があります。まず、次のように「2番目」のビューコントローラーのViewDidLoadメソッドでBarButtonItemを作成する必要があります。
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
initWithTitle:@"Back"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(OnClick_btnBack:)];
self.navigationItem.leftBarButtonItem = btnBack;
[btnBack release];
その後、次のように、同じ.mファイルで「btnBack」アクションのコードに書き込む必要があります。
-(IBAction)OnClick_btnBack:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
//[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}
それで全部です。
leftBarButtonItem
の外観を持っていないbackBarButtonItem
ことは、アプリケーションの設計で重要であるならば、。
タイトルが非常に長い親View Controllerがありました。これにより、戻るボタンのテキストが子ビューコントローラーのタイトルににじみ出ます。
さまざまな解決策を試した後、これが私がやったことです(@ john.k.doeアプローチを拡張します)。
Xcode 7.2、Swift 2の使用
Navigation Item
の親ビューコントローラシーン(ない子供VC)Attributes Inspector
あなたの新しいのNavigation Item
では、種類space
の文字Back Button
フィールド。これについては後で詳しく説明します。スニペット:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case is ChildViewController:
navigationItem.backBarButtonItem?.title = ""
default:
navigationItem.backBarButtonItem?.title = "Full Parent Title"
}
}
説明:
戻るボタンの並べ替えは、親のビューコントローラーに属します。Navigation Item
あなたは、コードやストーリーボードにタイトルを設定することができますので、あなたのバックボタンへのハンドルを提供します。
注意:
あなたがままにした場合Navigation Item
Back Button
、デフォルトは空の文字列としてテキストを、戻るボタンのタイトルは、「戻る」になります。
他のアプローチは機能しますが、なぜこれを使用するのですか?:
子ビューコントローラーの戻るボタンのタイトルをオーバーライドすることは可能ですが、画面で既に短時間点滅するまで、ハンドルを取得するのは困難でした。
一部のアプローチでは、新しい戻るボタンを作成し、既存のボタンをオーバーライドします。私はそれがうまくいくと確信しています、そしておそらくいくつかのユースケースでは必要です。ただし、可能な場合は既存のAPIを利用することを好みます。
title
親ビューコントローラのを変更することが、状況によっては最も迅速な解決策です。ただし、これにより親のタイトルが変更されるため、状態を管理する必要があります。Tab Bar Controller
タイトルの変更はTab Bar Item
タイトルに副作用を引き起こすため、事態も混乱します。
ストーリーボードを使用している場合は、親(ターゲットビューを保持しているビューではない)ビューコントローラーフレームを選択します(ナビゲーションバーを右クリックして、属性インスペクターを開くと、3つのフォーム入力が表示されます。3番目のビューは "戻るボタン」を探しております。
Swiftバージョン:
子ViewControllerで:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
これを行う別の方法を次に示します。
親ビューコントローラーで、次のメソッドを実装します。
- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
self.navigationItem.backBarButtonItem.title = newTitle;
}
子ビューコントローラーで、タイトルを変更する場合、これは機能します。
NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];
私はparentViewController
プロパティを機能させることができませんでした:
[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];
それがバグなのか、それとも正しく使用していないのかわかりません。しかし、viewControllers
配列の最後から2番目のビューコントローラーを取得すると、親ビューコントローラーがポイントされ、その参照を使用して親メソッドを正しく呼び出すことができます。
OK。私はこれらすべてのオプションを個人的に嫌っていました。したがって、私は自分で考えました。
私が見た情報に基づいています。前のビューコントローラーは、プッシュされたビューコントローラーに表示される独自の「戻る」ボタンを制御しているようです。
変更された戻るボタンを必要とするコントローラーで、navigationItemのレイジーロードメソッドを作成しました。
鉱山は、Invite Buyer Controllerです
Invite Buyerは、デフォルトで設定されているテキストです。
しかし、戻るボタンは招待する必要がありました
これが、戻るボタンの作成に使用したコードです。
このコードをコントローラーのImplementatio(.m)ファイルの上部に配置すると、スーパーのメソッドが自動的にオーバーライドされます。
- (UINavigationItem *)navigationItem{
UINavigationItem *item = [super navigationItem];
if (item != nil && item.backBarButtonItem == nil)
{
item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
item.backBarButtonItem.title = @"Invite";
}
return item;
}
これは、これを達成するためのはるかにエレガントな方法だと思います。
このコードを1か所に配置すると、必要なときに自動的に入力されます。
各プッシュリクエストの前にコードを呼び出す必要はありません。
お役に立てれば
ここに答えがあります:
でviewDidAppear:animated
(NOTでviewDidLoad
)次の操作を行います
- (void)viewDidAppear:(BOOL)animated
{
[self.navigationController.navigationBar.backItem setTitle:@"anything"];
// then call the super
[super viewDidAppear:animated];
}
戻るボタンの形状を保持したい場合。
ここで説明した解決策はどれも私にとってはうまくいきませんでした。だから私がやったことは、次の方法で私が出身したシーンからタイトルを削除することでした:
self.title = @"";
そのため、新しいシーンが表示されたときに、バックテキストは表示されません。
これは明確な解決策ではないことに同意しますが、機能し、説明されたものはどれも機能しませんでした。
次のビューコントローラーにプッシュする前に、ナビゲーションスタック内の現在のビューコントローラーのタイトルを、戻るボタンの目的のテキストに変更するのが最善であることがわかりました。
例えば
self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];
次に、viewDidAppearで、タイトルを元のVCの目的のタイトルに戻します。出来上がり!
戻るボタンの名前を変更する最も簡単な方法は、ビューコントローラーのタイトルを戻るボタンのタイトルに設定し、ビューコントローラーのナビゲーション項目のtitleViewを実際のカスタムラベルに置き換えることです。名前。
このような:
CustomViewController.m
@implementation CustomViewController
- (NSString*)title {
return @"Back Button Title";
}
- (void)viewDidLoad {
[super viewDidLoad];
UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
customTitleView.text = @"Navigation Bar Title";
customTitleView.font = [UIFont boldSystemFontOfSize:20];
customTitleView.backgroundColor = [UIColor clearColor];
customTitleView.textColor = [UIColor whiteColor];
customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
customTitleView.shadowOffset = CGSizeMake(0, -1);
[customTitleView sizeToFit];
self.navigationItem.titleView = [customTitleView autorelease];
}
@end
これにより、UINavigationBarのタイトルがネイティブであるかのように見えます。タイトルと戻るボタンのタイトルを分離する機能をビューコントローラに与える。
ビューコントローラーAとBの場合、Bが表示されている間、Aは戻るボタンの外観を指示する責任があります。
編集:これは、戻るボタンのネイティブの外観(左矢印バーボタン項目)も維持します。
このコードも機能します。これをナビゲーションコントローラのルートコントローラに配置します。
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
iOSでは新しいですが、ナビゲーションコントローラークラスをオーバーライドする非常に簡単な答えを提供します。単純にpushメソッドとpopメソッドをオーバーライドし、前のビューコントローラーのタイトルを保存します。jsブロックに貼り付けてごめんなさい。通常のコードブロックで貼り付ける方法について少し混乱しました。
#import "MyCustomNavController.h"
@implementation MyCustomNavController {
NSString *_savedTitle;
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
_savedTitle = self.topViewController.title;
self.topViewController.title = title;
[super pushViewController:viewController animated:animated];
}
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
[self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
return [super popViewControllerAnimated:animated];
}
@end
ほとんどの解決策は、元のスタイルのBackButton(左矢印バーボタン)を無効にし、必要なタイトルの通常のボタンを追加します。
したがって、元のスタイルを維持するには2つの方法があります
。1つ目は、ドキュメント化されていないボタンスタイル(110など)を使用する方法です。しかし、必要に応じて、ここで、stackoverflowでそれを行う方法を見つけることができます。
2番目:私はトレンスコウのアイデアを使用します。私はそれが好きで、少し変更して使用しています。
-(NSString *)titleを上書きする代わりに、次の方法で元のタイトルを維持することにしました(これにより、プッシュ状態でnibのタイトルと指定されたタイトルを使用できます)。
- (void)viewDidLoad {
[super viewDidLoad];
static NSString * backButtonTitle=@"Back"; //or whatever u want
if (![self.title isEqualToString:backButtonTitle]){
UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
customTitleView.text = self.title; // original title
customTitleView.font = [UIFont boldSystemFontOfSize:20];
customTitleView.backgroundColor = [UIColor clearColor];
customTitleView.textColor = [UIColor whiteColor];
customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
customTitleView.shadowOffset = CGSizeMake(0, -1);
[customTitleView sizeToFit];
self.navigationItem.titleView = [customTitleView autorelease];
self.title = backButtonTitle;
}
}
このソリューションは適切に機能し、ネイティブのように見えます。また、viewDidLoadメソッドで使用すると、1回以上実行されなくなります。
また、Jessedcのソリューションを試しましたが、見た目が悪いようです。これにより、ユーザーに表示されるタイトルバーは、オンザフライでオリジナルからバックボタンの必要なものに変わります。
これは、以前に投稿した回答の「簡略化された」バージョンとして機能します。
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];
backButton.title = @"Go Back";
self.navigationItem.backBarButtonItem = backButton;
子ビューまたは詳細ビュー(例:UIViewController)ではなく、親ビューコントローラー(例:テーブルビューまたはUITableViewControllerを持つビュー)内にコードを配置することを忘れないでください。
次のように、戻るボタンの文字列を簡単にローカライズできます。
backButton.title = NSLocalizedString(@"Back Title", nil);
2つのVC AとBがあります。
Bのタイトルを変更する場合は、このコードをAで記述します
- (IBAction)goToBViewController:(UIButton *)sender {
BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[self.navigationController pushViewController:vc animated:NO];
}
Swift 4.1 Xcode 9.4
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
スタンの答えは最高でした。しかし、それには問題もあります。タブバーでコントローラーを使用してコントローラーのタイトルを変更すると、タブバーのタイトルも変更できる可能性があります。関数の.title。答えはここにあります:(ARCを使用して、ビューのviewDidLoadに追加します)
static NSString * back_button_title=@"Back"; //or whatever u want
if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
custom_title_view.text = view_controller.navigationItem.title; // original title
custom_title_view.font = [UIFont boldSystemFontOfSize:20];
custom_title_view.backgroundColor = [UIColor clearColor];
custom_title_view.textColor = [UIColor whiteColor];
custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
custom_title_view.shadowOffset = CGSizeMake(0, -1);
[custom_title_view sizeToFit];
view_controller.navigationItem.titleView = custom_title_view;
view_controller.navigationItem.title = back_button_title;
}
私自身の使用では、私はそれをこのような関数にしています、viewDidLoadに1行のコードを持つ機能があるだけです。
+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
static NSString * back_button_title=@"Back"; //or whatever u want
if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
custom_title_view.text = view_controller.navigationItem.title; // original title
custom_title_view.font = [UIFont boldSystemFontOfSize:20];
custom_title_view.backgroundColor = [UIColor clearColor];
custom_title_view.textColor = [UIColor whiteColor];
custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
custom_title_view.shadowOffset = CGSizeMake(0, -1);
[custom_title_view sizeToFit];
view_controller.navigationItem.titleView = custom_title_view;
view_controller.navigationItem.title = back_button_title;
}
}
[戻る]ボタンのテキストを同じテキストに変更して元の左矢印の形状のままにするだけでなく、ユーザーが[戻る]ボタンをクリックしたときに何かを実行したい場合は、 " CustomNavigationController "を見回すことをお勧めします。
問題:ナビゲーションバーの「戻る」テキストは置換できません。
理由:親ビューコントローラーの.title属性がnilに設定されている(または初期化されていない)ため、ビューをプッシュした後、ナビゲーションバーに「戻る」ラベルが設定されます。
解決策:self.title = "Whatever ..."を設定すると、新しいView Controllerを押した後、「Back」の代わりに「Whatever ...」が表示されることがわかります。