如何更改导航栏上"后退"按钮的标题

Dal*_*ale 220 objective-c uinavigationbar uinavigationitem ios

目前,左栏按钮默认值是加载当前视图的视图的标题,换句话说,按下按钮时要显示的视图(后退按钮).

我想将按钮上显示的文本更改为其他内容.

我尝试在视图控制器的viewDidLoad方法中放入以下代码行,但它似乎不起作用.

self.navigationItem.leftBarButtonItem.title = @"Log Out";
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

谢谢.

Jor*_*dan 342

这应该放在调用标题为"NewTitle"的ViewController的方法中.就在push或popViewController语句之前.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Run Code Online (Sandbox Code Playgroud)

  • 在子视图控制器中,从子视图控制器调用它将不起作用.您必须在子视图控制器中从父视图控制器调用此方法. (47认同)
  • 乔丹说他"更加清楚地说明了在何处放置代码." 这里更加清晰:将它放在第一个(也就是父级)控制器中,紧接在调用第二个(也就是孩子)控制器之前. (4认同)
  • 要更改我的第三级视图控制器的后退按钮(第二次推送),我必须使用以下行而不是上面的答案:[[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; 难道我做错了什么? (2认同)
  • 您无需在推送或弹出之前执行此操作.您可以在viewDidLoad或loadView中执行此操作,也可以在此处为此视图设置标题和其他属性.恕我直言,Victor Bogdan的回答更清晰. (2认同)

小智 96

在ChildVC中,这对我有用......

self.navigationController.navigationBar.topItem.title = @"Back";
Run Code Online (Sandbox Code Playgroud)

也适用于Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
Run Code Online (Sandbox Code Playgroud)

  • 它改变了前一个视图控制器的标题,这就是这个解决方案中的问题 (46认同)
  • 在Xcode 5.0.2中的iOS 7上经过测试和验证.当你回到它时,这将把前一个屏幕的标题改为Back. (4认同)
  • @Nikita,你可以在viewWillDisappear中设置瓷砖 (2认同)

Vic*_*dan 81

这是backBarButtonItem的文档:

"当此导航项位于堆栈顶部项目的正下方时,导航控制器将从此导航项目中导出导航栏的后退按钮.[...]如果要为后退按钮指定自定义图像或标题,您可以将自定义栏按钮项目(包含您的自定义标题或图像)分配给此属性."

View Controller A("父"视图控制器):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
Run Code Online (Sandbox Code Playgroud)

当任何其他视图控制器B位于导航堆栈的顶部,并且A位于其下方时,B的后退按钮将具有标题"短".

  • 棘手的部分是你需要在PARENT视图控制器中设置后退按钮而不是子视图.浪费了一个小时才弄明白这一点. (4认同)

joh*_*doe 56

在Xcode 4.5中使用storyboard,到目前为止,当Back按钮的值不必动态更改时,我发现的最简单的解决方案是使用与View Controller的导航项关联的"Back Button"字段想要"后退"按钮说出别的.

例如,在下面的屏幕截图中,我想要视图控制器的后退按钮,我推动将"后退"作为后退按钮的标题.

在此输入图像描述

当然,如果你需要后退按钮来说每次稍微不同的东西,这将无法工作......这里有所有其他解决方案.


sen*_*lli 42

我知道,问题很老,但我找到了一个很好的解决方案.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Run Code Online (Sandbox Code Playgroud)

从childView工作!经过iOS 7测试.


Jes*_*edc 26

也许我过于简单化,但从Apple的文档中可以看出:

如果任一视图控制器未指定自定义栏按钮项,则使用默认后退按钮,并将其标题设置为上一个视图控制器的title属性的值 - 即,视图控制器向下一级堆栈.

上面标记为正确的解决方案从父控制器设置默认按钮项.这是正确的答案,但我正在通过self.title在将新控制器推送到NavigationController堆栈之前更改UIViewController的属性来解决问题.

这会自动更新下一个控制器上的后退按钮的标题,只要你self.title回到它应该的状态,viewWillAppear我就看不到这个方法造成太多问题.


Fel*_*ile 19

这项工作对我来说更好.试试:

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Run Code Online (Sandbox Code Playgroud)


小智 19

在Swift/iOS8中,以下内容对我有用:

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

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;
Run Code Online (Sandbox Code Playgroud)

来自费利佩的回答.

  • 样式应该是UIBarButtonItemStyle.Plain (3认同)
  • 谢谢你 这是一个多么可悲的API。并代表一般的UIKit。在iOS的导航栏和状态栏之间,我们仍然为这个该死的平台开发了一个奇迹。感谢婴儿耶稣堆栈溢出及其贡献者! (2认同)

EEE*_*EEE 17

好的,这是方法.如果你有一个视图控制器"第一",你通过按下按钮等导航另一个视图控制器"秒",你需要做一些工作.首先,您需要在"第二"视图控制器的ViewDidLoad方法中创建一个BarButtonItem,如下所示;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
Run Code Online (Sandbox Code Playgroud)

执行此操作后,您需要在同一个.m文件中写入"btnBack"操作的代码;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

就这样.

  • 如果在应用程序设计中这很重要,那么`leftBarButtonItem`就没有`backBarButtonItem`的外观. (2认同)

Rob*_*hen 16

我有一个父视图控制器,标题很长.这导致后退按钮文本渗透到子视图控制器的标题中.

在尝试了一堆不同的解决方案后,这就是我最终做的事情(扩展@ john.k.doe方法):

使用Xcode 7.2,Swift 2

  1. 在故事板中,添加Navigation Item视图控制器场景(而不是子VC)

导航项目

  1. Attributes Inspector您的新内容中Navigation Item,键入字段中的space字符Back Button.稍后会详细介绍.

视图层次结构中的导航项

在后退按钮字段中添加空格字符

  1. 视图控制器中,添加以下代码:

片段:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}
Run Code Online (Sandbox Code Playgroud)

说明:

后退按钮排序属于父视图控制器.它Navigation Item为您提供了后退按钮的句柄,因此您可以在代码或故事板中设置标题.

注意:

如果将Navigation Item Back Button文本保留为默认空字符串,则后退按钮标题将变为"后退".

其他方法有效,为什么要用这个呢?:

虽然可以覆盖子视图控制器上的后退按钮标题,但是在它已经在屏幕上短暂闪烁之前获取它是一个挑战.

一些方法构造了一个新的后退按钮并覆盖现有的后退按钮.我确信它有效,在某些用例中可能是必要的.但我更愿意尽可能利用现有的API.

title某些情况下,更改父视图控制器是最快的解决方案.但是,这会更改父标题,因此您必须管理状态.事情也变得混乱,Tab Bar Controller因为标题更改会导致标题的副作用Tab Bar Item.


ped*_*uan 10

对于那些使用故事板的人,只需选择父级(不是持有目标视图的那个)视图控制器框架(确保在导航栏上单击右键,然后打开属性检查器,在那里您将找到三个表单输入.第三个"后退按钮"是我们正在寻找的.

  • 如果您不关心本地化,这是最佳解决方案. (4认同)

bux*_*xik 7

Swift版本:

在您的孩子ViewController中:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lds 6

这是另一种方法.

在父视图控制器中,实现以下方法:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}
Run Code Online (Sandbox Code Playgroud)

在子视图控制器中,当您想要更改标题时,这将起作用:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];
Run Code Online (Sandbox Code Playgroud)

我从来没有能够让parentViewController财产工作:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];
Run Code Online (Sandbox Code Playgroud)

我不知道这是一个错误还是我没有正确使用它.但是抓住viewControllers数组中倒数第二个视图控制器指向父视图控制器,我可以使用该引用正确调用父方法.


The*_*der 5

好.我个人讨厌所有这些选择.所以我想出了自己的.

根据我看到的信息.看起来,前一个视图控制器控制着自己的"后退"按钮,该按钮将在推送的视图控制器上显示.

我已经为需要更改后退按钮的控制器上的navigationItem创建了一个Lazy Load方法.

我是一名邀请买家控制员

Invite Buyer是默认设置的文本.

但后退按钮必须是邀请

这是我用来创建后退按钮的代码.

我将此代码放在Controller的Implementatio(.m)文件的顶部,它自动覆盖了super的方法.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}
Run Code Online (Sandbox Code Playgroud)

我觉得这是一种更优雅的方式来实现这一目标.

我将此代码放在一个位置,并在需要时自动填充.

无需在每个推送请求之前调用代码.

希望这可以帮助


小智 5

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
Run Code Online (Sandbox Code Playgroud)


Bas*_*CAD 5

这是答案:

viewDidAppear:animated(不在viewDidLoad)执行以下操作

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

     // then call the super
     [super viewDidAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)

如果你想保持后退按钮的形状.


Jav*_*ría 5

这里解释的解决方案都不适合我.所以我做的是从我来自的场景中删除标题,方法如下:

self.title = @"";

因此,当呈现新场景时,不会出现后面的文本.

我绝对同意这根本不是一个明确的解决方案,但是有效并且没有一个解释对我有效.


小智 5

我发现最好在推送到下一个视图控制器之前将导航堆栈中当前视图控制器的标题更改为后退按钮的所需文本。

例如

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];
Run Code Online (Sandbox Code Playgroud)

然后在 viewDidAppear 中将标题设置回原始 VC 所需的标题。瞧!


Rya*_*n R 5

对于Swift:

    // 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
Run Code Online (Sandbox Code Playgroud)