删除iOS UIBarButtonItem的标题文本


198

我想做的是从a的“后退”按钮中删除文本UIBarButtonItem,仅在导航栏上保留蓝色V形箭头。请记住,我正在为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音乐应用中的后退按钮,该按钮仅具有一个人字形。

谢谢。



您为什么不了解您的要求?并在leftBarButtonItem中引用它。
Vishal Sharma 2015年

我不使用图片方法的原因是1.很难获得后退按钮的完美图片,并且2.图像会出现某种形式的失准,并且看起来不自然,这就是为什么我到StackOverflow寻求有关如何本地完成此操作的帮助。
潘子

Answers:


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

然后,您可以删除后退按钮项目标题。

如果使用情节提要,则可以将导航属性检查器的“后退按钮”设置为空格。


95
大标题存在一个问题:大标题没有居中而是被向右推,就像后退按钮文本仍在其中一样
sonxurxo 2014年

11
“ -按钮形状辅助功能”,如果用户打开此不起作用
的Mikael巴特利特

22
我认为这是一个更好的答案:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
benjamin

19
任何带有魔术数字的解决方案都是一个坏主意。随着自动布局,大小类,可访问性功能等的推销,使用像这样的常量值势必会伤到你。
Michael Peterson

3
为了提高在本杰明的评论,你应该设置本作UIControlStateHighlighted还有
N_B

411

要设置视图控制器的后退按钮标题而不更改其标题,请使用:

目标C:

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

迅速:

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

需要明确的是,这是在视图控制器上完成的,如果您按下后退按钮,您将看到它。即,您不想看到“ <设置”,而只是看到“ <”,然后在SettingsViewController上将其放入init。这样,您就不会在查看视图控制器本身时出现标题不显示的任何问题。


1
我不知道为什么其他答案被标记为正确,只是删除了标题,因此后退按钮确实显示了“标题”,但这根本不是正确的方法!这个应该是正确的答案。
2014年

8
对于使用Swift的任何人来说,它都是navigationItem.backBarButtonItem = UIBarButtonItem(title:“”,样式:.Plain,目标:nil,动作:nil)。从Obj-C转换为Swift并不难,但我会为您
省去麻烦

15
@BenjaminPiette您是否在UIViewController上调用此函数,如果单击后退按钮,您会看到它吗?不是显示后退按钮的UIViewController。
DonnaLea 2014年

2
多么优雅的解决方案!谢谢。只是做偏移的事情是不合适的。
2015年

2
如果您在导航堆栈中的前一个控制器上编写此代码行,则此解决方案将非常有效。
Bohdan Savych '17

128

如果您使用的是故事板,则可以转到Attributes InspectorViewController的Navigation Item(单击Navigation Bar),然后将Back Button属性设置为“”(一个空格字符)。这会将“后退按钮”标题设置为一个空格字符,使人字形可见。无需弄乱代码。

示例图片

请注意,这将为“后退按钮”设置Back Button标题,该按钮将从被按下的“后退按钮 ”上方紧扣到该“视图控制器 ”,而不是Back Button将显示在此“控制器”内部的后退按钮


10
我希望我能对此再投票:“请注意,这将为后退按钮设置“后退按钮”标题,该按钮将连接到此View Controller的顶部,而不是将显示在此视图中的后退按钮。管理员!”
杰森·莱恩

121

这对我来说只显示“后” V形,没有任何文本:

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

viewDidLoad显示导航栏的View Controller中设置此属性,即可解决问题。

注意:我仅在iOS 7中对其进行了测试,这在问题范围内。


33
这具有删除导航栏中间的标题标签的副作用。
2013年

7
使用相同的属性在'viewWillAppear'上设置推送VC的标题。这样就不会删除它。
Guto Araujo 2013年

5
我将这段代码移到-viewDidLoad了我不希望Back文本的VC上。但是,后来发现,当我从navigationController“标题”文本中弹出第二个VC 之后不久,而不是立即出现。我想有一个视频可以更好地说明这一点,所以在这里是:链接
Pan Ziyue 2014年

1
这不是最佳答案,请参考andyleehao的答案:[[[UIBarButtonItem外观] setBackButtonTitlePositionAdjustment:UIOffsetMake(0,-60)forBarMetrics:UIBarMetricsDefault];
lmnbeyond

1
根据Apple的文档,这是正确的答案:“当接收器位于导航项堆栈上且排在第二位时,也就是说,其视图控制器管理用户将导航回的视图,此属性中的值”用于最上方导航栏上的“后退”按钮。如果此属性的值为nil,则系统使用字符串“ Back”作为“后退”按钮的文本。”
拉斐尔·奥利维拉

27

设置按钮标题时,请使用@“”代替@“”。

- 编辑 -

尝试其他字符串时,有什么变化吗?我自己成功使用了以下代码:

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

backString是设置为@“”或@“ Back”的变量,具体取决于我使用的是iOS 7还是更低版本。

需要注意的一件事是,该代码不在我要为其自定义后退按钮的页面的控制器中。它实际上是在控制器中,然后才在导航堆栈中。


嗯,iOS 7似乎并没有改变。它一直使用“返回”作为标题。如果我改setLeftBarButtonItem:backButton而没有话。
潘子悦2013年

1
如果是这种情况,并且将标题设置为其他名称时没有任何反应,那么我认为您将不得不尝试将代码移至父视图控制器。我正在使用上面在prepareForSegue方法中发布的代码。
Kamaros

27

在此处输入图片说明

有时在上下文中查看事物会很有帮助。这是一个最小的项目,该项目隐藏“后退”文本,但仍显示箭头。

故事板

在此处输入图片说明

从“显示第二个视图控制器”按钮到第二个视图控制器有一个显示界面。

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

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

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

1
您可以使用backItem代替topItem。TopItem将隐藏标题,而backItem将隐藏后退按钮标题。
拉维·奥哈

2
如果childViewController在NavigationController的子堆栈中的深度为2+,则这是唯一的解决方案
Nathaniel

2
这还将删除以前的视图控制器的标题。在大多数情况下,这会很烂
CalZone '16

11

在iOS7上,Apple向UINavigationBar引入了两个新属性,即“ backIndicatorTransitionMaskImage”和“ backIndicatorImage”。

只需调用一次即可:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

它将继承keyWindow的色调颜色,而不是默认的V形字形,而是呈现自定义图像。

对于删除标题,我将建议卡马罗斯的答案。请记住在推送新视图控制器的视图控制器上调用此代码。删除iOS UIBarButtonItem的标题文本


调整色调颜色[[UINavigationBar外观] setTintColor:[UIColor whiteColor]];
Mazen Kasser 2013年

10

提供的答案并没有取得很大的成功,但是我确实找到了一个非常简单的解决方法。在情节提要中,您可以单击UIViewController的Navigation Item并设置后退按钮文本。我将其设置为单个''空间,它给了我想要的行为。在此处输入图片说明


10

这在iOS10中对我有用。从视图控制器的viewDidLoad调用它。

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

6

在iOS7和6上均可使用的解决此问题的简单方法是在viewDidLoad中设置自定义标题视图:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

然后,在viewWillAppear中:您可以安全地调用

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

由于标题视图是自定义视图,因此在导航堆栈中移回时不会被覆盖。


我只需要代码的后半部分,而不需要空白的UILabel。我[self.navigationItem.backBarButtonItem setTitle:@" "];在viewWillAppear 中调用,但是在关闭模态视图后无法处理所显示的视图。
Diziet 2014年

6

实际上,您只需一个技巧就可以做到这一点:

覆盖UINavigationBar类并添加以下代码行:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

然后UINavigationController使用此自定义UINavigationBar类初始化您。UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

希望这可以帮助


这对我有用。尽管在iOS 7上的推播动画似乎有些停滞:标题似乎为后退按钮腾出了空间,但由于没有按钮,因此居中。
泽克尔

是的,请尝试使用自定义titleView而不是直接设置navigationItem.title。我认为那应该解决您的问题。
rordulu 2014年

这个解决方案很棒,因为它对于每个具有子类的navigationBar都是全局的。谢谢
Yetispapa17年

5

使用DonnaLea的答案,我可以将一些东西拼凑在一起。这是解决方案出现在我的UIViewController子类中的方式:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

原始答案的问题在于,当您弹出该标题时,它将从控制器中删除该标题。在转换过程中尝试重置viewWillDisappear中的标题为时已晚;这会导致标题跳回去,而不是很好地制作动画。但是willMoveToParentViewController会更早发生,并允许正确的行为。

警告:我仅使用普通的UINavigationController push / pop进行了测试。在其他情况下,可能还会有其他意外行为。


4

在第一个ViewController的prepareForSegue:方法中,将视图标题设置为@“”,因此,当按下下一个视图时,它将显示前一个ViewController标题,即@“”。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

唯一的问题是,当您按下“后退”按钮时,先前的视图将没有标题,因此您可以在viewWillAppear上再次添加它:

- (void)viewWillAppear:(BOOL)animated{
    self.navigationItem.title = @"First View Title";
}

我不太喜欢这种解决方案,但是它有效,我也没有找到其他解决方案。



3

没有答案帮助了我。但是有一个窍门-我只是在按下按钮之前清除了按下(后退按钮将要到达的位置)视图控制器的标题。

因此,当上一个视图没有标题时,在iOS 7上,后退按钮将仅具有箭头,而没有文本。

viewWillAppear推送视图上,我放回了原始标题。


1
嗯,这个把戏有用。但是,看起来那里的单词有时会闪烁。这不是一个很好的解决方法,但是还是一个很好的解决方法。+1
潘子

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

我遇到了一个同样的问题,我就这样做了。

- 编辑 -

当您确实要删除所有UIBarbuttonItem的标题文本时,这是一个解决方案。如果只想删除后退栏按钮项的标题,则没有一种简单方便的解决方案。就我而言,由于我只有很少的UIBarButtonItems需要显示标题文本,因此我只是更改了这些特定按钮的titleTextAttributes。如果您想更具体一点,请使用以下代码,该代码只会更改导航栏按钮:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
这对我有用,但是回击时您可以短暂看到文本。
Diziet 2014年

3
@Diziet尝试为州UIControlStateHighlighted也添加相同的内容
CoderPug 2014年

2
这可以很好地工作,但是它也可以“隐藏”所有其他按钮,而不仅仅是“后退”按钮。
Urkman 2014年

3

这是使用子类navigationController删除的“后退”。

我正在使用它通过应用永久删除它。

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

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

@end

3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

1
请在您的答案中添加解释。
亚历克斯(Alex)

1制作与导航栏相同的颜色2缩小文字大小,以免挤压标题
Bill Xie

我查看了您的答案,您应该始终支持您的答案。
亚历克斯(Alex)

2

导航栏的“隐藏后退”按钮标题

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

这是我在做什么,这很容易删除后退按钮的标题

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

2

Swift 3.1 您可以通过实现UINavigationController的委托方法来实现。它将仅使用“后退”按钮隐藏“标题”,我们仍将获得后退箭头图像和默认功能。

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

1

您还可以使用以下命令:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

这对我有用


1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

1

全球完美的解决方案

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

所有的最垃圾的解决方案...它也像以前一样使用空间...它才变得透明...
Laszlo

它从应用程序的所有UIBarButtonItems中删除文本
Mikel Sanchez

1

我为其创建了一个自定义类,UINavigationController并将其应用于我的应用程序中的所有导航控制器。在此自定义UINavigationController类中UINavigationBarself将视图设置为委托。

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

然后,我实现委托方法:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

这样,我只需将自定义类分配给所有导航控制器,即可清除所有后退按钮的标题。为了清楚起见,我总是在内部设置所有其他视图控制器viewWillAppear的标题,以便始终在视图出现之前更新标题(以防被此类技巧删除)。



1

如果像我一样,您使用的是自定义视图而不是,UINavigationBar并且您后退按钮受阻,那么您必须做一些有点笨拙的工作。

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

好像没有显示它,那么无论它将尝试显示什么标题,这都意味着在显示它之前先隐藏它,然后再解决问题。


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

1

我已经做了一个非常简单的零配置类别,以隐藏整个应用程序中所有后退按钮的标题,您可以在此处查看。这个问题已经被接受,但是对于其他人可能会有所帮助。

编辑:

.h文件

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

.m文件

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
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.