导航栏隐藏返回按钮文字

126

如何隐藏UINavigation Controller的返回按钮文字?只想要"<"而不要"< Back"。


2
请使用navigationItem.leftBarButtonItem来设置自定义返回按钮,而不要修改默认文本。 - BaSha
https://dev59.com/onM_5IYBdhLWcg3wQQzw - Ayaz
如果您想要使用外观代理来实现全局解决方案,请查看我的下面的答案。 - heyfrank
36个回答

123
在界面构建器中,您可以选择前一个控制器的导航项并更改“Back Button”字符串以使返回按钮显示为所需内容。例如,如果您想要它为空白,只需输入一个空格即可。
您还可以使用此行代码更改它:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
或者在Swift中:
self.navigationItem.backBarButtonItem?.title = ""

3
太棒了,关于在Interface Builder中设置空白间隔的提示真是太好用了... :-D - Felipe Ferri
11
在XCode 8.3.2和Swift 3中,界面构建器和Swift编程路线对我无效。 - agrippa
你可以查看我的非常简单的解决方案,用于在整个应用程序中隐藏所有返回按钮。附言:不需要编写任何代码。 - Pratik Jamariya
3
如果在IB中,“返回按钮”已经是空白的,只需添加一个空格即可去掉“Back”,仅显示箭头。 - Tejas K
4
目前此方法仅适用于界面构建工具。无法通过代码设置,您需要像这样设置整个backBarButtonItem而不仅仅是标题:navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)。 - Leszek Szary
显示剩余3条评论

94

您可以这样实现UINavigationControllerDelegate

旧版Swift

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

Swift 4.x

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }
}

backBarButtonItem 默认为 nil,它影响下一个被推出的控制器,因此只需为所有控制器设置即可。


9
谢谢!经过查看4个重复的问题和数十个答案后,这是唯一一个有效的解决方案(而且没有搞乱其他任何东西)。 - inket
1
我已经有一个导航控制器子类,我将其作为自己的代理。这个方案非常完美。不过需要更新到Swift 3。 - Dean Kelly
非常好的解决方案,谢谢。这是唯一一个对我始终有效的方案。 - Elliott Davies
运行得非常好。 - tounaobun

83
您还可以通过Storyboard完成此操作。在前一个控制器的导航栏属性检查器中,您可以将“返回”按钮字段设置为“ ”。请参阅下面的图像。将“Your Title here”替换为“ ”即可实现所需的结果。您不需要再调整“标题”。
编程方式可以使用以下代码:
```[self.navigationItem.backBarButtonItem setTitle:@" "];```
其中self是指推送所需视图控制器的控制器。
样例前后导航栏如下: Before Before After After

7
如果在故事板中设置,这将完美地运作。只需确保导航栏中有一个导航项,以便可以进行设置。 - user1940321
12
在iOS 9 / Xcode 7.3中,通过编程方式设置“backBarButtonItem”无法生效,但是可以通过故事板进行设置。 - Scott Gardner
@ScottGardner,在iOS 9中,通过编程方式设置backBarButtonItem对我来说是有效的。这里有更多相关信息。 - Suragch
如果您的屏幕上没有导航栏,可能是因为它需要隐藏,您可以在Storyboard中添加导航项到上一个视图控制器,并将其返回按钮设置为“ ”。 - Martin Berger
解决方案非常好,而且在Xcode 9.2/iOS 11中实现非常容易。 - Ray Hunter
该方法目前仅在界面构建器中有效。从代码中设置无效,您需要像这样设置整个backBarButtonItem而不是仅设置标题:navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) - Leszek Szary

56

将返回按钮标题设置为@""nil是不起作用的。您需要将整个按钮设置为空(没有标题或图像):

Objective-C

[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];

快速

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

这应该在导航堆栈中位于您视图控制器上方的视图控制器上完成(即,您通过 pushViewController 方法导航到您的 VC 的位置)。


2
谢谢,它能工作了!在Swift中:self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) - mostworld77
优秀的回答正确指出仅仅更改默认backBarButtonItem的标题是不够的。如果提到应该在前一个视图控制器中设置backBarButtonItem,则会获得额外的加分。 - Crazed'n'Dazed
所以这个可以工作,但是在iOS14的长按返回按钮时,弹出的浮动表视图不再显示视图控制器的标题;( - zaitsman

32
在viewDidLoad或loadView中添加以下代码。
self.navigationController.navigationBar.topItem.title = @"";  

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


21
这没有清除前一个视图控制器的标题吗? - CalZone
6
不要使用,因为这会删除最后一个屏幕标题。 - evya
1
如果您需要从当前视图控制器执行此操作,则为避免从上一个视图控制器中删除标题,您应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) - Leszek Szary

31

如果您有大量视图控制器并且想要解决这个问题,另一个解决方法是使用UIAppearance代理来有效地隐藏返回按钮标题文本,如下所示:

另一种解决此问题的方法是,当您拥有大量视图控制器时,可以使用UIAppearance代理来有效地隐藏返回按钮标题文本,例如:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

这种解决方案将文本呈现为微小的透明点,类似于手动将返回按钮标题设置为@" ",但它会影响所有导航栏按钮。

我不建议将此作为问题的通用解决方案,因为它会影响所有导航栏按钮。它改变了范例,你需要选择何时显示按钮标题而不是何时隐藏标题。

要选择何时显示标题,请手动根据需要恢复标题文本属性或创建一个专门的UIBarButtonItem子类来执行相同操作(可能还需要另一个UIAppearance代理)。

如果您有一个应用程序,其中大多数返回按钮标题都需要隐藏,并且只有少数(或没有)导航按钮是带有标题的系统按钮,则可以尝试使用此方法!

(注意:即使文本颜色是透明的,也需要更改字体大小以确保长标题不会导致中心导航栏标题向右移动)


这是我实现中最简单的解决方案。谢谢。 - Trevor Panhorst
3
这是否也覆盖了不是返回按钮的左侧导航栏按钮? - kevinl
1
是的,我注意到了。"它影响所有导航栏按钮"。 - Adam Kaplan
2
它不应该影响导航栏中的所有其他按钮,包括左/右侧栏按钮项,对吗? - Fyodor Volchyok
是的,他没有指定更全面的要求。 - Adam Kaplan
新的iOS 13测试版中无法正常工作,有修复的解决方案吗?:( - bezoadam

25

我尝试过一些以上和以下的方法,但它们都不起作用。这个对我来说有效:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = ""
}

5
如果你需要从当前视图控制器执行此操作,为了避免移除上一个视图控制器的标题,你应该执行以下操作:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)。 - Leszek Szary

16

您可以添加此 Objective-C 类别,使导航控制器创建的所有“返回”按钮都没有文本。我刚刚将其添加到我的 AppDelegate.m 文件中。


@implementation UINavigationItem (Customization)

/**
 Removes text from all default back buttons so only the arrow or custom image shows up.
 */
-(UIBarButtonItem *)backBarButtonItem
{
    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

PS-(我不知道如何让这个扩展与Swift一起使用,因为它会出现奇怪的错误。欢迎编辑添加Swift版本)


这会给出标题“Back”,而不是隐藏标题。 - Raj Aggrawal
真的,如何在Swift中“覆盖”它。非常有趣的问题。 - Andrey Gagan
@teradyl 这是最佳答案。 - aks.knit1108
@Andrey Gagan,请看我的回答。 - Abirami Bala
这适用于 iOS 9.0 - 10.3.3,但在 iOS 11+ 上不起作用。 - Sihad Begovic
你不应该使用分类/扩展来覆盖一个方法。这样很容易在未来的任何时候出现问题。 - Leszek Szary

14

唯一没有副作用的方法是创建一个自定义返回按钮。只要您不提供自定义操作,连滑动手势也可以使用。

extension UIViewController {
func setupBackButton() {
    let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = customBackButton
}}

很不幸,如果您希望所有返回按钮都没有任何标题,则需要在所有视图控制器中设置此自定义返回按钮 :/

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

你需要将标题设置为空格而不是空字符串,这非常重要。


11

目前的答案不起作用。我想要完全删除标题,但是文字“back”仍然存在。

返回到上一个视图控制器并设置其标题属性:

self.title = @" ";

只有在前一个视图控制器没有标题的情况下才有效


@ZevEisenberg 确保在视图控制器的生命周期中显示属性之前已经设置。这意味着应该在viewDidLoad或viewWillAppear方法中设置它。 - ChrisHaze
1
请确保在引号之间留有空格 - ChrisHaze
1
实际上,对我来说,没有空格也能正常工作;只需要使用空字符串:@"" - Zev Eisenberg
1
@ZevEisenberg,当我第一次想出这个解决方案时,是在Xcode 5之前。有空格是唯一的可行方式,这就是为什么我在示例代码中包含了它的原因。Xcode 6更新似乎已经将其包括了进去。好知道 - 谢谢。 - ChrisHaze
我也使用了我的方法,它仍然有效,并且实际上也删除了标准的返回箭头。 - ChrisHaze

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