227

現在、左バー ボタンのデフォルト値は、現在のビューをロードしたビューのタイトルです。つまり、ボタンが押された (戻るボタン) ときに表示されるビューです。

ボタンに表示されるテキストを別のものに変更したい。

ビューコントローラーのviewDidLoadメソッドに次のコード行を入れてみましたが、うまくいかないようです。

self.navigationItem.leftBarButtonItem.title = @"Log Out";

私は何をすべきか?

ありがとう。

4

37 に答える 37

343

これは、「NewTitle」というタイトルの ViewController を呼び出すメソッドに配置する必要があります。push または popViewController ステートメントの直前。

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
于 2009-09-19T19:58:37.203 に答える
97

ChildVCでは、これは私にとってはうまくいきました...

self.navigationController.navigationBar.topItem.title = @"Back";

Swiftでも動く!

self.navigationController!.navigationBar.topItem!.title = "Back"
于 2013-02-19T14:09:37.187 に答える
82

backBarButtonItemのドキュメントは次のとおりです。

「このナビゲーション アイテムがスタックの一番上のアイテムのすぐ下にある場合、ナビゲーション コントローラーは、このナビゲーション アイテムからナビゲーション バーの戻るボタンを派生させます。 [...] 戻るボタンのカスタム イメージまたはタイトルを指定する場合代わりに、カスタム バー ボタン項目 (カスタム タイトルまたはイメージを含む) をこのプロパティに割り当てることができます。"

ビュー コントローラーA ( 「親」ビュー コントローラー):

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"になります。

于 2012-06-14T10:43:45.237 に答える
56

in Xcode 4.5 using storyboard, by far the easiest solution i've found when the value of the Back button doesn't have to change dynamically is to use the "Back Button" field associated with the Navigation Item of the View Controller to which you want the "Back" button to say something else.

e.g. in the screenshot below, i want the Back button for the view controller(s) that i push to have "Back" as the title of the Back button.

enter image description here

of course, this won't work if you need the back button to say something slightly different each time … there are all of the other solutions here for that.

于 2012-12-10T01:46:31.190 に答える
26

多分私は単純化しすぎているかもしれませんが、Appleのドキュメントからの文言は次のとおりです。

カスタムバー ボタン項目がどちらのビュー コントローラーでも指定されていない場合、デフォルトの戻るボタンが使用され、そのタイトルは前のビュー コントローラー (つまり、1 レベル下のビュー コントローラー) の title プロパティの値に設定されます。スタック。

上で正しいとマークされたソリューションは、親コントローラーからデフォルトのボタン項目を設定します。正解ですがself.title、新しいコントローラーを NavigationController スタックにプッシュする直前に UIViewController のプロパティを変更することで問題を解決しています。

self.titleこれにより、次のコントローラーの戻るボタンのタイトルが自動的に更新されます。本来あるべき状態に戻っている限り、viewWillAppearこのメソッドが多くの問題を引き起こしていることはわかりません。

于 2009-10-21T03:04:33.837 に答える
20

Swift/iOS8では、次のことがうまくいきました:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

フェリペの答えから移植。

于 2014-08-22T00:04:09.083 に答える
17

よし、これが道だ。「最初」のView Controllerがあり、ボタンなどを押して別のView Controllerを「2番目」にナビゲートする場合は、いくつかの作業を行う必要があります。最初に、「2 番目の」View Controller の 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];
}

それで全部です。

于 2009-09-19T23:01:37.400 に答える
10

ストーリーボードを使用している場合は、親(ターゲットビューを保持しているものではない)ビューコントローラーフレームを選択するだけです(ナビゲーションバーを右クリックして、属性インスペクターを開くと、3つのフォーム入力があります。3つ目は "戻るボタン」は私たちが探しているものです。

于 2012-11-05T21:14:32.517 に答える
6

これを行う別の方法があります。

親ViewControllerで、次のメソッドを実装します。

- (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番目のView Controllerを取得すると、親View Controllerがポイントされ、その参照を使用して親メソッドを正しく呼び出すことができます。

于 2009-09-19T20:21:04.710 に答える
6

わかった。私は個人的にこれらすべてのオプションが嫌いでした。したがって、私は自分自身を思いつきました。

私が見た情報に基づいています。前のView Controllerは、プッシュされたView Controllerに表示される独自の「戻る」ボタンを制御しているようです。

変更された [戻る] ボタンが必要なコントローラーで、navigationItem の Lazy Load メソッドを作成しました。

私のは招待バイヤーコントローラーです

Invite Buyer は、デフォルトで設定されているテキストです。

しかし、戻るボタンは招待する必要がありました

戻るボタンを作成するために使用したコードは次のとおりです。

このコードをコントローラーの実装 (.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 か所に配置すると、必要に応じて自動的に入力されます。

各プッシュ リクエストの前にコードを呼び出す必要はありません。

お役に立てれば

于 2012-02-14T02:51:05.187 に答える
6

スイフトの場合:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
于 2015-11-19T08:40:54.477 に答える
5

ここで説明されている解決策はどれもうまくいきませんでした。だから私がしたことは、次の方法で私が来たシーンからタイトルを削除することでした:

self.title = @"";

そのため、新しいシーンが表示されると、バック テキストは表示されません。

これは明確な解決策ではないことに絶対に同意しますが、うまくいき、説明されたものはどれもうまくいきませんでした。

于 2015-06-17T08:38:42.500 に答える
5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
于 2012-09-05T12:36:20.590 に答える
5

答えは次のとおりです。

viewDidAppear:animated(ではないviewDidLoad)、次のことを行います

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

戻るボタンの形状を維持したい場合。

于 2013-04-22T11:04:03.033 に答える
4

戻るボタンの名前を変更する最も簡単な方法は、View Controllerのタイトルを戻るボタンのタイトルに設定してから、ViewControllerのナビゲーションアイテムの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の場合、Aは、Bが表示されている間、戻るボタンがどのように見えるかを指示する責任があります。

編集:これは、戻るボタンのネイティブな外観(左矢印のバーボタンアイテム)も維持します。

于 2011-11-21T09:53:23.640 に答える
4

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

于 2016-10-13T11:45:04.120 に答える
4

このコードも機能します。これをナビゲーション コントローラーのルート コントローラーに配置します。

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
于 2015-03-15T15:14:15.127 に答える
4

self.navigationController.navigationBar.backItem.title = @"TEXT";

そしてスウィフトでは:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
于 2011-09-06T08:49:47.417 に答える
3

ほとんどのソリューションでは、元のスタイルの BackButton (左矢印バー ボタン) を削除し、希望のタイトルの通常のボタンを追加します。
元のスタイルを維持するには、次の 2 つの方法があります。
1 つ目: 文書化されていないボタン スタイル (110 など) を使用する。ただし、必要に応じて、ここのスタックオーバーフローでその方法を見つけることができます。
2回目:Trenskowのアイデアを利用する。気に入って少し変えて使っています。
- (NSString*)title をオーバーライドする代わりに、元のタイトルを次の方法で保持することにしました (これにより、ペン先のタイトルとプッシュ状態で指定されたタイトルを使用できます)。

- (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 メソッドで使用すると、複数回実行できなくなります。
また、Jessedc のソリューションを試してみましたが、見た目が悪いです。これにより、ユーザーのタイトル バーが元の状態から BackButton の目的の状態に、またその逆にオンザフライで変更されます。

于 2012-04-02T14:29:25.537 に答える
3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

親コントローラーのコード内の好きな場所に配置できます。これにより、子ビューごとに異なる戻るボタンを使用できます。

于 2011-08-31T11:04:54.310 に答える
2

これは、以前に投稿された回答の「簡略化された」バージョンとして機能します。

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

子ビューまたは詳細ビュー (UIViewController など) ではなく、親ビュー コントローラー (テーブル ビューまたは UITableViewController を持つビューなど) 内にコードを配置することを忘れないでください。

次のように、戻るボタンの文字列を簡単にローカライズできます。

backButton.title = NSLocalizedString(@"Back Title", nil);
于 2014-02-23T20:17:50.177 に答える
1

スタンの答えは最高でした。ただし、タブバーでコントローラーを使用してコントローラーのタイトルを変更すると、タブバーのタイトルも変更できるという問題もあります。そのため、view_controller.navigationItem.titleのみを変更し、view_controller.navigationItemを使用するのが最善の方法です。関数内の.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;
  }
}
于 2012-11-30T15:27:39.373 に答える
1

以下のコード行を使用します。

UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"hello"
                                 style:UIBarButtonItemStylePlain
                                target:nil
                                action:nil];

self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil];

self.navigationItem.leftItemsSupplementBackButton = YES;
于 2016-03-30T12:48:57.603 に答える
1

問題: ナビゲーション バーの「戻る」テキストを置き換えることができません。

理由: 親ビュー コントローラーの .title 属性が nil に設定されている (または初期化されていない) ため、ビューをプッシュした後、ナビゲーション バーに「戻る」ラベルが設定されます。

1 つの解決策: self.title="Whatever..." を設定すると、新しいビュー コントローラーを押した後、"Back" の代わりに "Whatever..." が表示されることがわかります。

于 2015-04-03T18:08:18.253 に答える