如何在iOS导航控制器中设置返回按钮文本?

251
如何删除返回按钮文本。
当前返回按钮:

< 返回

期望的返回按钮:

< 任何其他

这些都不起作用:
self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title
28个回答

678

返回按钮属于上一个视图控制器,而不是当前显示在屏幕上的视图控制器。
要修改返回按钮,应该在引发segue的视图控制器中推送之前更新它:

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

Swift 3, 4 & 5:

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

或者

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)


13
非常感谢,你不知道我为了那个小细节(之前的控制器)花了多少个小时。 - Ricardo
3
如果我可以点赞一百万次,我会这样做。无法告诉你我花了多长时间纠结为什么它不起作用(之前在目标控制器上)。 - Dylan Ireland
38
“返回按钮属于上一个视图控制器”,这是我在这个主题上找到的最有价值的答案!非常感谢! - vhristoskov
1
设置title会更改标题,而不仅仅是返回按钮。 - Yariv Nissim
5
我将以下代码翻译成中文:我添加了self.navigationController!.navigationBar.topItem!.backBarButtonItem = backItem,而不是navigationItem.backBarButtonItem = backItem,在Swift 3上可以正常工作。谢谢。 - Indra Adam
显示剩余8条评论

136
您可以通过界面设计器完成以下操作:

点击上一个视图控制器的导航项

enter image description here

从属性检查器中将返回按钮文本设置为您想要的任何内容。就这样!

enter image description here


1
最好的赋值“nil”的方式是什么? - kennydust
9
@kennydust 是的,在“后退”按钮中加入空格并按回车。 - Ajinkya Patil
简单易懂,但它是否可本地化? - Gruntcakes
2
@AjinkyaPatil 我尝试了这个,但是返回按钮没有显示出来。有什么可能的原因吗? - user805981
@AjinkyaPatil 是的,我有尝试过。但还是不行。你有 GitHub 的示例吗?谢谢! - user805981
显示剩余6条评论

67

你可以将这三行代码放在你想要更改返回按钮标题的ViewController中。

在你的override func viewDidLoad() {}中。

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

3
这个解决方案似乎更正确,因为你把逻辑放在到达的 ViewController 而不是你离开的 ViewController。也就是说:它看起来更好。 - Sentry.co
3
可行的解决方案,但需要注意一个重要的限制:记住返回按钮仍然属于上一个视图控制器。例如,如果您的导航是 A > B < 返回到 A > C,并且您将此代码放入 B 中,则 C 中的返回按钮也会显示“我的返回按钮标题”。 - Alessandro Mulloni

55

返回按钮文本取自父视图控制器的导航项标题。因此,无论您在上一个视图控制器的导航项标题上设置了什么,都将显示在当前视图控制器的返回按钮文本中。 您可以在父视图控制器的viewWillAppear方法中将导航项标题设置为""。

self.navigationItem.title = ""

另一种方法是将其放置在

之后。
self.navigationController?.navigationBar.topItem?.title = ""

在当前视图控制器的viewWillAppear方法中。如果导航堆栈过于嵌套,这将导致其他问题。


5
最佳答案是将 "self.navigationItem.title = ""放在顶部!" - rilar
我同意这是最佳答案,因为上面的所有答案都需要向导航项添加目标函数,所以它们不仅仅是更改文本,还要添加自定义弹出函数,而这并不是问题所需的! - IsPha
这在 prepareForSegue 中运行良好,因为加载新的视图控制器后你不需要修改它。 - Adrian
注意!!!在调用self.navigationItem.title = ""之前,先输入self.title = "....."。 - Bary Levy

44

如果您正在使用xib文件来创建视图控制器,则需要在您的视图控制器类中执行以下操作。

class AboutUsViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    edgesForExtendedLayout = []
    setUpNavBar()
}

func setUpNavBar(){
    //For title in navigation bar
    self.navigationController?.view.backgroundColor = UIColor.white
    self.navigationController?.view.tintColor = UIColor.orange
    self.navigationItem.title = "About Us"

    //For back button in navigation bar
    let backButton = UIBarButtonItem()
    backButton.title = "Back"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
}

}
结果将是:

enter image description here


31

我不知道你在哪里使用了你在问题中提到的方法,但如果我在我的ViewController类中(我想要更改返回按钮的类)在viewDidLoad()函数上使用以下代码行,我可以获得所需的结果:

[self.navigationItem.backBarButtonItem setTitle:@"返回"];
self.navigationController?.navigationBar.backItem?.title = "Anything Else"

结果为:

之前

enter image description here

之后

enter image description here


3
在我的情况下,只有将这段代码放在viewDidAppear方法而不是viewDidLoad方法中才能起作用。 - apinho
2
使用 navigationController.navigationBar.topItem?.title = "" 代替在 viewDidAppear 中设置,以避免该问题。 - José
这似乎是最令人满意的方法,它避免了在调用控制器中使用self.navigationItem.title = ""时出现闪烁。此外,在通过选项卡控制器程序化快速切换到视图控制器的其他情况下,此方法也可以避免被完全忽略。 - FlimFlam Vir

24

返回按钮属于上一个视图控制器,而不是当前显示的视图控制器。要修改返回按钮,您应该在推送之前更新它,在viewdidload中添加:

Swift 4:

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

12

您可以仅修改Storyboard中的NavigationItem。

在此输入图片描述

在“返回”按钮中添加一个空格并按Enter键。

注意:请在上一个VC中执行此操作。


9
这应该可以运行:
override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
    self.navigationItem.backBarButtonItem = button

}

func goBack()
{
    self.navigationController?.popViewControllerAnimated(true)
}

虽然不推荐这样做,因为它实际上替换了返回按钮,也删除了返回箭头和滑动手势。


10
这不是正确的做法,你只是替换了返回按钮。 - Yariv Nissim
最好从界面构建器中完成。 - Rutger Huijsmans

9

Swift 4.2

如果您想更改导航栏返回按钮的文本,请将下面的代码放在显示返回按钮之前的控制器的viewDidLoad方法中,而不是在显示返回按钮的视图控制器中。

 let backButton = UIBarButtonItem()
 backButton.title = "New Back Button Text"
 self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

如果你想改变当前导航栏标题的文本,请使用以下代码(请注意,这将成为推入导航控制器上的下一个视图的默认返回文本,但是此默认返回文本可以被上面的代码覆盖)

 self.title = "Navigation Bar Title"

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