UINavigationController“后退按钮”自定义文本?


147

UINavigationController默认情况下,“后退按钮”的a 显示堆栈中最后一个视图的标题。有没有办法在后退按钮中包含自定义文本?


1
这项工作对我来说self.navigationController.navigationBar.topItem.title = @"Custom text";
huync

Answers:


342

从此链接

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

正如泰勒在评论中所说:

不要在可见的视图控制器中执行此操作,而是在视图控制器中单击后退按钮


4
你应该releaseUIBarButtonItem
Mehrdad Afshari

217
还要注意,您需要在视图控制器中向上一级进行此操作。换句话说,不要在可见的视图控制器中执行此操作,而要在视图控制器中执行以下操作:单击后退按钮。
泰勒

6
只是为了澄清Tyler的评论,因为我一开始并不了解这一点:在视图控制器中设置backBarButtonItem NavigationItem是设置将显示为返回至该视图控制器的按钮。还要注意,尽管箭头按钮没有按钮样式,但此按钮仍然会获得箭头样式。我使用过UIBarButtonItemStylePlain,但仍然获得箭头按钮样式。
乔恩·斯坦梅兹

3
建议:传递当前设置的样式,而不是采用样式。在此答案的代码中,替换UIBarButtonItemStyleBordered为对property的调用self.navigationItem.backBarButtonItem.style。文档:developer.apple.com/library/ios/documentation/uikit/reference/...
罗勒布尔克

1
请注意,在ARC下,您必须忽略自动释放调用。因此您具有self.navigationItem.backBarButtonItem = [[UIBarButtonItem分配] initWithTitle:@“自定义标题”样式:UIBarButtonItemStyleBordered目标:无操作:无];
bkbeachlabs 2014年

43

您可以在“界面生成器”中设置文本:

选择后退按钮将返回的ViewController导航项:

在此处输入图片说明

在实用程序面板属性检查器中,为“后退按钮”输入标签:

在此处输入图片说明

与在接受的答案中那样在代码中设置标题相比,我更喜欢这种方法。

还要注意,您需要在视图控制器中向上一级进行此操作。换句话说,不要在可见的视图控制器中执行此操作,而要在视图控制器中执行以下操作:单击后退按钮。
-泰勒


这是我到目前为止找到的最佳答案。
Ayan Sengupta 2014年

2
为了清楚起见,需要在视图控制器的“导航项”上而不是在视图控制器的属性检查器本身上进行设置。
帕特里克·

这是我找到的最佳答案。
bicepjai 2014年

这是最好的答案
Alex Brown

2
从Xcode 6.1.1开始,并在iOS 7中运行,看来您以前的原始视图标题仍会覆盖您在此处设置的任何后退按钮标题。如果上一个视图的标题包含的字符数不能超过11个字符,则下一个视图的后退按钮将简单地说“ Back”。除了从头开始创建新的导航栏项目(如此处最受好评的答案所示)外,没有其他方法可以解决。
射线

22

我用这个:

// 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";
}

这几乎对我
有用

3
这将在堆栈中向上更改控制器的“后退”按钮标题。它不会更改当前显示的控制器的“后退”按钮标题。更糟糕的是:它会将控制器的标题更改为先前的控制器!
leviathan

正如其他评论者所指出的那样,这种方法有点难以为继。我不建议您这样做,因为这并不是API希望您使用它的方式。您将来可能会遇到一些困难的错误!
RickDT

11

通过在将另一个控制器推入堆栈之前简单地设置控制器的标题,我找到了一个方便的解决方案,如下所示:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

然后,确保在中设置原始标题viewWillAppear,如下所示:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

之所以UINavigationController可行,是因为在推操作期间构造后退按钮时的默认行为是使用前一个控制器的标题。


1
这样做的问题是,随着动画的出现,旧视图上的标题会发生变化,看起来有点n。给定的解决方案似乎都没有您想要的那样:-(
Danny Tuppeny 2010年

1
在我的情况下,这很完美,因为我没有在前一个屏幕上显示NavBar,而只想从新屏幕上的后退按钮中删除titleLabel,而只有iOS7人字形箭头。因此,我可以为标题设置一个空的NSString文字。
siburb

推动视图控制器在点击时引发异常
Sumit Susing

7

后退按钮的标题默认为上一个视图的标题,因此我使用的一个快速技巧是将以下代码放在前一个视图的.m文件中。

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

这在很多情况下都非常有效,而且非常简单...仅观察到,要覆盖这两种方法中的任何一种,都需要在新方法的某个时刻调用super的实现。
izk 2012年

2
通过这种方法,在推送动画发生之前,人们会注意到父视图的标题被更改为“ Back”。(而且,sorta很烂,如果将其移到viewDidDisappear方法,则可以看到在推送后发生切换。)
James Boutcher 2013年

我喜欢这种方法,但是我面临的问题是“原始标题”设置正确,但是如果它长于“后退”,则带有省略号,这是因为视图尚未进入视图层次结构,它不会中继标题视图。由于动画的快速初始速度,上述@JamesBoutcher所描述的问题对我而言并不明显。实际上,我刚刚意识到,由于动画的慢速结束(这个问题很明显),我面对的问题尤其明显。
trss 2014年

尽管在stackoverflow.com/questions/1441699/…上获得的答案似乎比需要的要更多的自定义,但这是有据可查的方式,更重要的是似乎更符合我们的意图。
trss 2014年

6

在您的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;
}

然后添加一个简单的方法,以允许视图控制器关闭:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

在viewDidLoad或loadView中添加以下代码

self.navigationController.navigationBar.topItem.title = @"Custom text";

我在iOS 9的iPhone和iPad上进行了测试


应该是self.navigationController?.navigationBar.backItem?.title =“ Custom Text”
和平

1
我需要的唯一区别是navigationControllertopItem属性上的可选链接,例如:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel,2016年

2

添加到控制的答案。从Apple的文档中注意到,backBarButtonItem的声明是这样的:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

因此,rein的答案将泄漏内存,因为合成的setter将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];

希望这可以帮助!


请注意,这些天来,使用ARC时,您无需担心自动发布(如果尝试在启用了ARC的项目中自动发布,则编译器会出错)
Eric Goldberg

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

我发现了一些有趣的东西。如果您将子类化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];

然后,对于所有ViewControllers由导航控制器推送的内容,将自动在其中包含“后退”按钮。如果您想更改某些视图控制器的文本,可以尝试将viewcontroller强制转换为某个类或您自己的自定义协议(您的viewcontroller继承自该协议,可以使用类似的方法backButtonText或类似),它可以为您提供有关视图控制器的某些信息,以便您可以自定义后退按钮文本。现在,将后退按钮的文本放在一个应完全负责的地方。我必须承认,创建一个新按钮来更改文本很烂,但是哦。

谁能想到为什么不这样做的原因?至少,您不必摆弄Viewcontroller标题,也不必记住在按下导航控制器上的ViewController之前创建一个新的后退按钮。


0

in的答案很好。

请注意,如果您按下多个视图控制器,则将为每个视图控制器显示更改的后退按钮标题,这可能不是您想要的。

在这种情况下,每次按下视图控制器时,都需要创建自定义UIBarButtonItem。

另外,请确保按下视图控制器之前执行此操作,否则标题更改时会出现屏幕打ic的情况。


0

扩展Aubrey的建议,您可以在子视图控制器中执行以下操作:

创建两个变量以存储父级的navigationItem.title和父级的NavigationItem的旧值

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

这不是完美的。随着新控制器的动画效果,您将看到父视图的标题发生变化。但这确实达到了自定义标记后退按钮并使其形状像标准后退按钮的目的。


0

把它放到你身上viewDidLoad,希望它会变成你想要的东西

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

如果要在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放在控制器扩展中。


0

我知道这是一个古老的问题,答案的种类已经更新!

最简单的方法是在父ViewController中执行此操作:

即带您进入下一个视图控制器的控制器。

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

-1

在代码中执行此操作会删除的后退按钮样式UINavigationConroller。如果您在每个视图中添加一个导航项,则可以在中设置后botton的标题StoryBoard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.