删除iOS UIBarButtonItem的标题文本

时间:2013-09-29 14:09:37

标签: ios uinavigationbar uibarbuttonitem uinavigationitem

我想要做的是从UIBarButtonItem的“后退”按钮中删除文本,只在导航栏上留下蓝色V形符号。请记住,我正在为iOS 7开发。我尝试了几种方法,包括但不限于:

这是我不喜欢的图像方法(图像看起来不合适):<​​/ p>

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音乐应用程序中的后退按钮,它只有一个单一的V形。

感谢。

39 个答案:

答案 0 :(得分:409)

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

目标-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)

要清楚,这是在视图控制器上完成的,如果你点击后退按钮就会看到。,而不是看到&#39;&lt;设置&#39;你想看到&#39;&lt;&#39;然后在你的SettingsViewController上,你将它放在你的init中。然后,当您查看视图控制器本身时,您不会看到标题中的任何问题。

答案 1 :(得分:199)

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

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

如果您使用Storyboard,则可以使用空格设置导航属性检查器后退按钮。

答案 2 :(得分:127)

如果您使用的是Storyboard,可以转到ViewController的Attributes Inspector Navigation Item(点击Navigation Bar)并将Back Button属性设置为“”(一个空格字符) )。这会将后退按钮标题设置为一个空格字符,使人字形可见。不需要乱码。

example image

请注意,这会将后退按钮的Back Button标题设置为从此顶部推送的视图控制器,而不是{{1}这将显示在此控制器内!

答案 3 :(得分:122)

这对我来说只显示&#39; back&#39;没有任何文字的雪佛龙:

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

在视图控制器的viewDidLoad中设置此属性,显示导航栏,它将起到作用。

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

答案 4 :(得分:27)

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

- 编辑 -

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

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

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

需要注意的一点是,此代码不在我想要自定义后退按钮的页面的控制器中。它实际上位于导航堆栈之前的控制器中。

答案 5 :(得分:26)

enter image description here

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

<强>故事板

enter image description here

从“显示第二视图控制器”按钮到第二个视图控制器有一个show 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,无代码)

在情节提要上,选择第一个视图控制器(不是第二个)的导航项。只需为后退按钮文本输入空格即可。

enter image description here

答案 6 :(得分:15)

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

答案 7 :(得分:11)

在iOS7上,Apple为UINavigationBar引入了两个新属性,'backIndicatorTransitionMaskImage'和'backIndicatorImage'。

只需拨打一次电话:

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

它将渲染自定义图像而不是默认的V形符号,继承keyWindow的色调颜色。

为了删除标题,我会建议Kamaros的回答。请记住在推动新视图控制器的视图控制器上调用此代码。 Removing the title text of an iOS UIBarButtonItem

答案 8 :(得分:10)

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

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

答案 9 :(得分:10)

我提供的答案并没有取得多大成功,但我确实找到了一个非常简单的解决方法。在故事板中,您可以单击UIViewController的导航项并设置后退按钮文本。我将它设置为一个单独的空间,它给了我正在寻找的行为。enter image description here

答案 10 :(得分:6)

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

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

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

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

希望这有帮助

答案 11 :(得分: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 = @" ";

由于您的标题视图是自定义视图,因此在向后移动导航堆栈时不会被覆盖。

答案 12 :(得分:4)

我能够使用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测试了这个。在其他情况下可能会有其他意外行为。

答案 13 :(得分:4)

SWIFT 3

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

答案 14 :(得分:4)

在第一个ViewController的prepareForSegue:方法中,你将标题视图设置为@&#34;&#34;,所以当按下下一个视图时,它将显示前一个ViewController标题,它将是@&#34; &#34;

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

唯一的问题是,当您点击后退按钮时,您之前的视图没有标题,因此您可以在viewWillAppear上再次添加:

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

我不太喜欢这个解决方案但是它有效并且我没有找到其他方法来做到这一点。

答案 15 :(得分: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

答案 16 :(得分:3)

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

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

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

- 编辑 -

当您确实要删除所有UIBarbuttonItem的标题文本时,这是一个解决方案。如果您只想删除后栏按钮项的标题,则没有一个简单方便的解决方案。在我的情况下,由于我只有很少需要显示标题文本的UIBarButtonItem,我只是更改了那些特定按钮的titleTextAttributes。如果您想更具体地使用下面的代码,它只会更改导航栏按钮:

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

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

答案 17 :(得分: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];

答案 18 :(得分:3)

没有答案帮助了我。但是一个技巧 - 我只是在推动它之前清除了推动的视图控制器的标题(后退按钮的位置)。

因此,当前一个视图没有标题时,在iOS 7上,后退按钮只有一个箭头,没有文字。

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

答案 19 :(得分: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
    }

答案 20 :(得分:2)

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

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

答案 21 :(得分:2)

这是我正在做的事情,删除后退按钮的标题更简单

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

答案 22 :(得分:1)

这是更好的解决方案。

其他解决方案很危险,因为它是黑客攻击。

extension UINavigationController {

    func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
        viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        pushViewController(viewController, animated: animated)
    }
}

答案 23 :(得分:1)

case : <Back as <

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

答案 24 :(得分:1)

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

答案 25 :(得分:1)

如果和我一样,你使用的是自定义视图而不是UINavigationBar,并且你仍然坚持使用后退按钮,那么你必须做一些感觉有点笨拙的工作。

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

似乎它没有被呈现,然后无论它尝试显示标题,这意味着它被展示然后隐藏在它被绘制之前并解决了问题

答案 26 :(得分:1)

我为UINavigationController创建了一个自定义类,并将其应用于我应用中的所有导航控制器。在此自定义UINavigationController课程中,我在视图加载后将UINavigationBar代理设置为self

- (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中的所有其他视图控制器设置标题,以便在视图出现之前始终更新标题(如果它被这样的技巧删除)。

答案 27 :(得分:1)

全球完美解决方案

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

答案 28 :(得分:1)

您也可以使用:

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

[temporaryBarButtonItem release];

这对我有用

答案 29 :(得分:0)

只需为后退按钮导航项输入单个空间即可生效!!

答案 30 :(得分:0)

我列出了迄今为止对我有用的解决方案。

df  
a   b
1   5
2   6
3   4
7   8

答案 31 :(得分:0)

实施您自己的UIViewController基类并覆盖setTitle:

@interface CustomViewController : UIViewController
@end

@implementation CustomViewController

- (void)setTitle:(NSString *)title {
    super.title = @""; // This will remove the "Back" title
    UILabel *titleView = [UILabel new];
    // customize the label as you wish
    titleView.text = title;
    [titleView sizeToFit];
    self.navigationItem.titleView = titleView;
}

@end

现在,在您要设置标题的任何UIViewController中,您可以像往常一样编写self.title = @"MyTitle",并且在推送新{{1}时,后栏项上不会显示任何文字}}

答案 32 :(得分:0)

我已经制作了一个非常简单的零配置类别来隐藏所有后退按钮标题,你可以查看here。这个问题已经接受了答案,但对其他人来说这可能会有所帮助。

修改

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

答案 33 :(得分:0)

在iOS 11中,您可以使用下一个代码隐藏按钮标题:

<强>夫特:

onProgressChanged()

此代码不会从导航栏中删除标题,但只是使其透明,后退按钮仍保留标题空间。如果您需要为视图控制器标题提供更多空间,则需要使用其他解决方案。

答案 34 :(得分:0)

使用Guto Araujo对navigationBar.topItem.title = @"";

的回答,我无法使用它

但是,通过在我的视图控制器的self.title = @""方法中设置init,我能够获得所需的效果。 (在init中设置很重要,viewDidLoad无效。)

答案 35 :(得分:0)

如果要在iOS11中删除后退按钮项目标题,可以尝试一下!

@implementation UIView (PrivateBackButton)

    + (void)initialize {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            [NSObject hookInstanceMethodForClass:[self class] originalMethod:@selector(layoutSubviews) newMethod:@selector(mc_layoutSubviews)];
        });
    }

    - (void)mc_layoutSubviews {
        [self mc_layoutSubviews];
        [self updateiOS11LaterUI];
    }

    - (void)updateiOS11LaterUI {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        if (![self isKindOfClass:NSClassFromString(@"_UIBackButtonContainerView")]) return;

        [self removeAllSubviews];
        [self.superview mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(@44);
        }];
    }

    @end

答案 36 :(得分:-1)

只需在 ParentViewController 中设置空白标题文字。

self.navigationItem.title=@"";

如果您需要标题文本,请将以下两个方法放在ParentViewController中。

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

-(void)viewWillDisappear:(BOOL)animated
{
    self.navigationItem.title=@"";
}

答案 37 :(得分:-3)

这在iOS 7 +中适用于我:

在viewDidLoad中:

self.navigationItem.backBarButtonItem.title = @" ";

是的,这是引号之间的空格。

答案 38 :(得分:-3)

只需为UIBarButtonItem外观设置偏移量。

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