如何更改UINavigationController返回按钮的名称?

60

我有一个UIViewController,我正在从我的第一个视图控制器导航到第二个视图控制器,我想更改在navigationcontroller上显示的返回按钮的名称....

SecondViewController *secondController = [[SecondViewController alloc]
                                              initWithNibName:nil
                                              bundle:NULL]; 
[self.navigationController pushViewController:secondController  animated:YES];

现在我想在第二个viewcontroller中更改navigationController中按钮的名称。

18个回答

185

如果您希望以编程的方式实现这一点,可以按照以下步骤进行:

Objective-C

UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"Custom"
                                                             style:UIBarButtonItemStyleBordered
                                                            target:nil
                                                            action:nil];

[self.navigationItem setBackBarButtonItem:backItem];

Swift

let backItem = UIBarButtonItem(title: "Custom", style: .Bordered, target: nil, action: nil)
navigationItem.backBarButtonItem = backItem

如果您更喜欢使用Interface Builder,只需选择要设置返回按钮的UINavigationItem,然后导航到属性检查器以更改返回按钮的标题。

enter image description here

注意:重要的是要记住,在点击返回按钮后要返回的视图控制器上配置此选项,而不是当前可见的视图控制器。


1
@Shady 它还在那里。只需选择您的 UINavigationItem,您将在 Interface Builder 的“属性检查器”选项卡中看到它。 - Mick MacCallum
11
谢谢这个。特别是最后的注释。 - palme
3
这个笔记非常重要,应该使用更大的字体,并置于答案开头。 - sports
3
自 iOS8 开始,UIBarButtonItemStyleBordered 已被弃用,现在应该使用 UIBarButtonItemStylePlain - drpawelo
2
这个注释非常重要! - chengsam
显示剩余3条评论

42

在Interface Builder或Storyboard中有一种简单的方法可以实现此功能。在父视图控制器中,只需将导航项的属性“返回按钮”设置为您想要的任何标题即可。以下是一个示例:

从父视图控制器设置子视图控制器的返回按钮标题

像我们刚刚在父级导航控制器(Best Bars)的属性检查器中设置的那样,Villian's Tavern View将具有“返回”作为返回按钮标题。


如果你的故事板上还没有导航项,你可能需要在视图控制器中添加一个。为此,从对象库中选择UINavigationItem并将其拖到故事板上的视图控制器上。 - David Green

35

在viewWillAppear中编写此代码。

self.navigationItem.title = @"List View";

并在ViewWillDisappear中写入以下内容

self.navigationItem.title = @"Back";

它可以在没有故事版的情况下工作。


2
以这种方式完成,您将在新视图之前实际看到标题更改(特别是如果您有动画)。如果您使用viewDidDisappear,则会看到按钮实际更改。 NSPostWhenIdle的解决方案更好。 原始来源:http://blog.evandavey.com/2008/12/how-to-change-text-on-back-button-in-uinavigationbar-uinavigationcontroller.html - Καrτhικ
15
这不应该成为被接受的答案。0x7fffffff的答案是执行此操作的支持方法。 - Brody Robertson
2
这个已经不再起作用了。而且非常hacky。用户716216的答案[https://dev59.com/qGkw5IYBdhLWcg3wdKbD#9871741]应该是正确的。 - palme
我已经尝试了所有的解决方案,但唯一无瑕地在任何地方工作的方法是在设计师中或通过代码向导航栏添加一个条形按钮,并手动设置自定义选择器。相信我,这只需要三四行任务,但可以节省许多沮丧。 - vishal dharankar
2
这不是一个很好的答案,因为它实际上是在绕过提供的UIKit视图控制器栏按钮设施而不是与其一起工作。请参见下面@0x7ffffffff的答案。 - Adam Kaplan
我不知道为什么大家都对这个答案有意见...它可能不是最佳实践,但它运行得很好... - David Seek

4

Swift 3:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Back"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

注意:返回按钮属于前一个视图控制器,而不是当前在屏幕上呈现的视图控制器。 要修改返回按钮,您应该在推送之前在启动segue的视图控制器上进行更新:

4
在我的情况下,只有在主线程上运行代码才能正常工作,如下所示:
dispatch_async(dispatch_get_main_queue(), ^(void) {

    self.navigationController.navigationBar.backItem.title = @"Custom Title";
});

1
这将更改层次结构中的所有视图控制器,因此如果您按返回按钮,则先前的视图控制器标题也会受到影响。因此,需要处理该情况。 - cocoaNoob
感谢您的评论。 - neowinston

3
在Swift中,我发现解决方案非常简单。假设我在ViewControllerA上,要前往ViewControllerB,如果我想要更改在ViewControllerB上显示的返回按钮名称,我将在ViewControllerA中进行操作。请保留HTML标签,不要添加解释。
self.title = "BackButtonTitle"

这就是全部内容。

注意:这将更改 ViewControllerA 的标题。


2
这将更改 ViewControllerA 的标题,而不是更改 VCB 上的返回按钮。 - Entalpi

3

我正在 ViewController1 上,并且要前往 ViewController2,如果我想要更改在 ViewController2 上显示的返回按钮名称,我需要在 ViewController2 中进行更改。

Swift 5

self.navigationController?.navigationBar.topItem?.title = "BackButtonTitle"

Objective-C

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

1
尝试像这样:-
NSArray *viewControllerArr = [self.navigationController viewControllers];
// get index of the previous ViewContoller
long previousViewControllerIndex = [viewControllerArr indexOfObject:self] - 1;
UIViewController *previous;
if (previousViewControllerIndex >= 0) {
    previous = [viewControllerArr objectAtIndex:previousViewControllerIndex];
    previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                                 initWithTitle:@"Back"
                                                 style:UIBarButtonItemStylePlain
                                                 target:self
                                                 action:nil];
}

1
你可以通过使用 navigationItemtitleView 来实现这一点。
Swift 3答案
• 创建一个用于 UINavigationItem 的扩展,如下所示。
extension UINavigationItem {
    func customTitle(title: String) {
        let titleLabel = UILabel()
        titleLabel.text = title
        titleLabel.textColor = UIColor.white
        titleLabel.textAlignment = .center
        titleLabel.sizeToFit()
        titleView = titleLabel
    }
}

• 在您的控制器viewDidLoad中执行以下操作

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        title = "Text For Back Button"
        navigationItem.customTitle(title: "Title for your view controller")
}

1
实际上,您可以更改后退按钮的标题:

self.navigationItem.backBarButtonItem.title = @"NewName";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接