移除iOS UIBarButtonItem的标题文本

199

我的目标是从一个UIBarButtonItem的“返回”按钮中删除文本,只留下导航栏上的蓝色箭头。请注意,我正在为iOS 7开发。我尝试了几种方法,包括但不限于:

这是一种图片方法,但我不喜欢(图片看起来不协调):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

我尝试的另一种方法是这样的,但它根本行不通(没有显示任何内容):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

我想要实现的是类似于 iOS 7 音乐应用中仅带有单个箭头的返回按钮。

谢谢。


看这个答案:https://dev59.com/RWMk5IYBdhLWcg3w5R6k#20300577 - ayalcinkaya
为什么不拍下您的需求图像?然后在leftBarButtonItem中引用它。 - Vishal Sharma
我没有使用图片方法的原因是,一是很难得到一个完美的后退按钮图像,二是图像会存在某种形式的错位,看起来不自然,这就是为什么我去StackOverflow寻求帮助来实现本地化。 - Pan Ziyue
39个回答

412

如果要设置视图控制器的返回按钮标题而不更改其标题,请使用以下方法:

Objective-C:

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

Swift:

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

明确一点,这是在你点击返回按钮后看到的视图控制器上完成的。比如,你想要看到'<'而不是'< Settings',那么你需要在你的SettingsViewController的init中添加这个代码。这样当你查看视图控制器本身时,就不会出现标题不显示的任何问题。


1
我不知道为什么另一个答案被标记为正确的,它只是删除了标题,所以返回按钮没有“标题”可以显示,但这根本不是正确的方法! 这个应该是正确的答案。 - Pach
8
对于使用Swift的任何人,它的导航项(navigationItem).backBarButtonItem = UIBarButtonItem(title:"", style: .Plain, target: nil, action: nil)。从Objective-C转换到Swift并不难,但我为你省去了麻烦。 - Zoyt
15
你是在询问是否将此方法调用在点击返回按钮后所看到的 UIViewController 上,而不是显示返回按钮的 UIViewController 上。 - DonnaLea
2
多么优雅的解决方案!谢谢。偏移操作总感觉不太对。 - Hyder
2
如果您在导航堆栈中的前一个控制器上编写此行代码,则此解决方案将完美运行。 - Bohdan Savych
显示剩余16条评论

198
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

那么您可以删除返回按钮的标题。

如果您使用Storyboard,您可以将导航属性检查器中的返回按钮设置为空格。


96
大标题存在一个问题:它们不是居中对齐的,而是向右推,就像返回按钮文本仍然存在一样。 - sonxurxo
11
如果用户打开了“辅助功能-按钮形状”,则此方法无效。 - Mikael Bartlett
22
我认为这是一个更好的答案:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];的意思是设置UIBarButtonItem的标题文本属性,将其前景颜色设置为透明,并将其应用于正常状态。 - benjamin
19
任何带有魔数(magic numbers)的解决方案都是不好的。随着推动自动布局、大小类别、辅助功能等方面的发展,使用像这样的常量值注定会让您后悔。 - Michael Peterson
3
为了改进Benjamin的评论,您应该将其设置为“UIControlStateHighlighted”状态。 - n_b
显示剩余12条评论

127
如果您正在使用Storyboard,可以进入ViewController的Navigation Item(点击Navigation Bar)的属性检查器,并将"Back Button"属性设置为""(一个空格字符)。这将将返回按钮标题设置为一个空格字符,同时保留尖头。无需涉及代码。
请注意,这会为从被推到其上面的视图控制器中segue到此视图控制器的返回按钮设置Back Button标题,而不是在此控制器内显示的Back Button

10
我希望我能给这个点赞更多:“请注意,这将设置返回按钮的标题,该按钮将从推到其上方的一个视图控制器后,跳转到此视图控制器,而不是为将在此控制器内显示的返回按钮设置标题!” - Jayson Lane

120

这对我有效,只显示“后退”符号而没有任何文本:

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

将此属性设置在呈现导航栏的视图控制器的viewDidLoad中,它就可以起作用。

注意:我只在iOS 7中测试过,这是问题范围内的。


33
这会导致导航栏中间的标题标签被移除,具有副作用。 - Pwner
7
在 'viewWillAppear' 方法中,使用相同属性设置将要推出的视图控制器的标题,这样它就不会被移除了。 - Guto Araujo
5
我把那段代码移到了我不想要“返回”文本的VC的-viewDidLoad里。然而,后来我发现当我从navigationController弹出第二个VC时,“标题”文本会短暂地出现,而不是立即消失。我觉得一个视频可以更好地说明这一点,所以下面是链接:link - Pan Ziyue
1
这不是最好的答案,请参考andyleehao的答案:[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault]; - lmnbeyond
1
这是根据苹果文档的正确答案:“当接收器位于导航项堆栈上并且从顶部开始第二个 - 换句话说,它的视图控制器管理用户将要导航回的视图时,此属性中的值用于顶部导航栏上的返回按钮。如果此属性的值为nil,则系统使用字符串“Back”作为返回按钮的文本。” - Raphael Oliveira
显示剩余6条评论

28

在此输入图片描述

有时候,以上下文的方式查看事物是很有帮助的。这是一个最小化项目,它隐藏了“返回”文本,但仍然显示箭头。

故事板

在此输入图片描述

从“Show Second View Controller”按钮到第二视图控制器有一个展示segue。

我还添加了一个导航项到第二个视图控制器,以便它有一个标题。这是可选的。它不会影响返回按钮。

代码

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

备选方法(仅适用于IB,无需代码)

在故事板中选择第一个视图控制器的导航项目(而不是第二个)。只需输入一个空格作为返回按钮文本。

在此输入图片描述


关键概念是,“对于第一个视图控制器(而不是第二个)”,因为它是您想要返回的VC的名称,所以它有责任提供此标题。 - BuguiBu

27

当您设置按钮标题时,请使用@" "而不是@""。

--编辑--

尝试其他字符串时是否会有任何更改?我自己正在成功使用以下代码:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString是一个变量,根据我所在的iOS版本是7还是更低版本,它被设置为@" "或@"Back"。

需要注意的一件事是,这段代码并不在我想要自定义返回按钮的页面的控制器中。实际上,它位于导航堆栈中在它之前的控制器中。


嗯,iOS 7似乎没有改变那个。它仍然使用“返回”作为标题。如果我改用setLeftBarButtonItem:backButton,则什么也不会显示。 - Pan Ziyue
1
如果是这种情况,并且当您将标题设置为其他内容时没有任何反应,我认为您将不得不尝试将代码移动到父视图控制器中。我在我的prepareForSegue方法中使用了我上面发布的代码。 - Kamaros

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

1
您可以使用backItem代替topItem。 TopItem会隐藏标题,而backItem会隐藏返回按钮的标题。 - Ravi Ojha
2
如果childViewController在NavigationController的子堆栈中深度为2+,那么这是唯一的解决方案。 - Nathaniel
2
这也将删除上一个视图控制器的标题。在大多数情况下,这会很糟糕。 - CalZone

11
在iOS7中,苹果公司为UINavigationBar引入了两个新属性:'backIndicatorTransitionMaskImage'和'backIndicatorImage'。
通过简单调用一次:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

它将呈现自定义图像,而不是默认的矢车菱形符号,并继承keyWindow的色调颜色。

如果要删除标题,我建议使用Kamaros的答案。请记得在推送新视图控制器的视图控制器上调用此代码。如何删除iOS UIBarButtonItem的标题文本


调整色调颜色 [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; - Mazen Kasser

10

我在提供的答案中没有取得太多成功,但我找到了一个非常简单的解决方法。在你的Storyboard中,你可以点击你的UIViewController的Navigation Item并设置返回按钮文本。我将它设置为一个单一的空格,这给了我我想要的行为。输入图像描述


10

这对我在iOS10中有效。从视图控制器的viewDidLoad中调用此函数。

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

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