如何在Swift中设置后退按钮文本


207

如何删除后退按钮文本。

当前的后退按钮:

<返回

所需的后退按钮:

<其他

这些都不起作用:

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

Answers:


604

后退按钮属于上一个视图控制器,而不是当前在屏幕上显示的那个。
要修改后退按钮,您应该启动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
}

斯威夫特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)

9
非常感谢,您不知道我为那个小细节(以前的控制器)花了多少小时
Ricardo

3
如果我可以投票一百万次,我会。无法告诉您我花了多长时间想知道为什么它不起作用(以前在目标控制器上)
Dylan Ireland

13
“后退按钮属于先前的视图控制器”,这是我找到的关于该主题的最有价值的答案!谢谢!
vhristoskov '16

1
设置title更改将更改标题,而不仅仅是后退按钮。
Yariv Nissim

4
我添加了self.navigationController!.navigationBar.topItem!.backBarButtonItem = backItem而不是navigationItem.backBarButtonItem = backItem,它在Swift 3上运行良好。谢谢
Indra Adam

125

您可以通过界面生成器执行以下操作:

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

在此处输入图片说明

从属性检查器中,将“后退”按钮文本设置为所需的任何文本。而已!!

在此处输入图片说明


1
分配“ nil”的最佳方法是什么?
kennydust '16

@kennydust您的意思是空白标题吗?
Ajinkya Patil

8
@kennydust是,在后退按钮中添加空间,然后按Enter
Ajinkya Patil

不错,很容易,但是可以本地化吗?
Gruntcakes '16

2
@AjinkyaPatil我尝试了此操作,但后退按钮未显示。有什么原因吗?
user805981'6

48

后退按钮文本取自父级视图控制器的导航项目标题。因此,无论您在上一个视图控制器的导航项目标题上设置的内容如何,​​都将显示在当前视图控制器的后退按钮文本上。您只需在父视图控制器的viewWillAppear方法中将“”作为导航项标题即可。

self.navigationItem.title = ""

另一种方法是

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

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


5
self.navigationItem.title =“”应该放在最上面,作为最佳答案!
2016年

我确实认为这是最佳答案,因为上面的所有答案都需要向导航项添加目标功能,因此它们不仅是更改文本,而且还添加了自定义弹出功能,这不是问题所必需的!
IsPha

这在中可以正常工作prepareForSegue。更干净一点,因为您无需在加载新viewController后对其进行更改。
阿德里安

请注意!!!将self.title =“ .....”放在对self.navigationItem.title =“”的调用之前
Bary Levy

45

您可以将这3行代码放入ViewController要更改后退按钮标题的代码

在你的override func viewDidLoad() {}

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

2
这种解决方案似乎更正确,因为您将逻辑放在到达的VC中而不是要离开的VC中。又名:读起来更好。
eonist

37

如果您将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
}

}

结果将是:

在此处输入图片说明


29

我不知道您在哪里使用了要在问题中使用的方法,但是如果我在ViewController类(要更改后退按钮)上的viewDidLoad()函数上使用以下行,则可以得到所需的结果:

self.navigationController?.navigationBar.backItem?.title = "Anything Else"

结果将是:

之前

在此处输入图片说明

在此处输入图片说明


3
就我而言,只有将这段代码放在viewDidAppear方法上而不是viewDidLoad上,它才有效
apinho

2
使用navigationController.navigationBar.topItem?.title = ""来避免把这个中viewDidAppear
何塞

这似乎是最令人满意的方法,并且避免了闪烁,因为在调用控制器(速度较慢的设备)中使用self.navigationItem.title =“”将后退按钮标题更改为“”。另外,完全忽略了self.navigationItem.title =“”的其他情况也可以通过选项卡控制器的选项卡开关间歇性地快速过渡到视图控制器中。
FlimFlam Vir

22

后退按钮属于上一个视图控制器,而不是当前在屏幕上显示的那个。要修改后退按钮,您应该在按下按钮之前对其进行更新,添加viewdidload:

斯威夫特4:

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

12

您只需在情节提要中修改NavigationItem

在此处输入图片说明

在“后退”按钮中添加一个空格,然后按Enter。

注意:在以前的VC中执行此操作。


8

Swift 4-在按下任何视图控制器之前配置后退按钮

// if you want to remove the text
navigationItem.backBarButtonItem = UIBarButtonItem()

// if you want to modify the text to "back"
navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)

8

这应该工作:

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)
}

尽管不建议这样做,因为它实际上替换了backButton,并且还删除了后退箭头和滑动手势。


10
不是正确的方法,您只是在更换后退按钮
Yariv Nissim 2015年

最好由界面生成器来完成
Rutger Huijsmans

7

斯威夫特4.2

如果要更改导航栏的后退按钮项文本,请将其放在viewDidLoad控制器中显示后退按钮的位置之前,而不是放在显示后退按钮的视图控制器上。

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

如果要更改当前导航栏标题文本,请使用下面的代码(请注意,这将成为推送到导航控制器上的NEXT视图的默认背景文本,但是该默认背景文本可以被上面的代码覆盖)

 self.title = "Navigation Bar Title"

6

有两种方法。

1.在previousViewController.viewDidLoad()中

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"
navigationItem.backBarButtonItem = backBarBtnItem

2.在currentViewController.viewDidAppear()中

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"      
navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem

原因:backButton来自navigationBar.backItem.backBarButtonItem,所以第一种方式是obvious.In currentViewController.viewDidLoad(),我们无法获得的参考backItem,因为在viewDidAppear(),在navigationBarnavigationViewstack。所以我们可以更改backItem在currentViewController。 viewDidAppear()

有关更多详细信息,请参见Document:UINavigationBar


3

呈现控制器viewDidLoad方法中添加:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton

2

尽管这些答案可以解决问题,但这可能会很有用

class MainNavigatioController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        // first
        let backItem = UIBarButtonItem()
        backItem.title = "رجوع"
        self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
        // then
        super.pushViewController(viewController, animated: animated)

    }

}

2

斯威夫特4

尽管前面所说的准备进行搜索是正确的,并且确实如此,后退按钮属于以前的VC,但它只是添加了许多不必要的代码。

最好的办法是在viewDidLoad中设置当前VC的标题,它将在下一个VC上自动正确设置后退按钮的标题。这条线对我有用

navigationController?.navigationBar.topItem?.title = "Title"

2

这适用于Swift 5

self.navigationItem.backBarButtonItem?.title = ""

请注意,它将对下一个推送的视图控制器有效,而不对显示屏上的当前控制器有效,这就是为什么它非常令人困惑!

另外,检查情节提要,选择上一个视图控制器的导航项,然后在“后退按钮(检查器)”中键入内容。


1

试试这个...它将起作用....

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.title = ""
}

上面的代码将隐藏文本,并仅在导航栏上显示后退箭头。


0

设置self.title = "" 在之前self.navigationController?.pushViewController(vc, animated: true)


0
override func viewWillAppear(_ animated: Bool) {

    self.tabBarController?.navigationItem.title = "Notes"

    let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))

    self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
}

func goToNoteEditorViewController(){
   // action what you want
}

希望能帮助到你!!#swift 3


0

如果要从页面视图控制器页面推送视图控制器,则无法更新导航控制器的后退按钮标题。要解决此问题,请创建一个返回到父级视图控制器的委托(您也许还可以遍历视图控制器层次结构回到父级)。

此外,“后退”按钮有字符限制。如果超过该字符数限制,系统将默认为“返回”。它不会为您截断。例如:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.

0

斯威夫特4

在我的情况下,解决方案是在移至子视图控制器之前,清除主视图控制器的导航项。如果再次显示,请重新设置

主控制器

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationItem.title = "Master Title"
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.title = ""
}

这就是我按下UIViewController并清除子控制器中的后退按钮按钮的方式:

主控制器

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)


0

GOTCHA:如果您遇到许多建议不正确的建议,请确保您UITableViewCellviewDidLoad()而不是从中注册sinit()


-1

检查解决方案并在Swift 5中工作

下面我针对不同情况提出了几种解决方案:

1.从“后退”按钮删除文本

从“后退”按钮删除文本的最佳解决方案是在viewDidLoad()中添加:

navigationItem.backBarButtonItem = UIBarButtonItem()

2.在返回按钮上设置自己的文本

如果要设置自己的标题,请通过设置backButton的标题来完成:

let backButton = UIBarButtonItem()
backButton.title = "My Title"
navigationItem.backBarButtonItem = backItem

3.所有VC上的后退按钮为空

如果要在整个应用中创建通用样式-要使箭头向后没有文本,请为所有View Controller创建基础VC:

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

上面提供的解决方案使您以后可以自定义后退按钮(如果以后想做一些异常),方法是添加其他变量并将其覆盖在特定的ViewController f.ex中:

class BaseViewController: UIViewController {

    var customBackButtonTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        var backButton = UIBarButtonItem()
        if let text = customBackButtonTitle {
            backButton.title = text
        }
        navigationItem.backBarButtonItem = backButton
    }
}

-2

迅捷4

有一种方法可以通过编程方式从当前viewController中更改backButton中的文本:

navigationController?.navigationBar.items![0].title = "some new text"
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.