199

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

谢谢。

4

39 回答 39

412

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

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

需要明确的是,这是在视图控制器上完成的,如果您点击后退按钮,您会看到它。即,您不想看到“< Settings”,而是只想看到“<”,然后在 SettingsViewController 上将其放入init. 然后,当您查看视图控制器本身时,您不会遇到任何标题未显示的问题。

于 2014-05-05T04:56:55.543 回答
198
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

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

如果您使用 Storyboard,您可以设置导航属性检查器 Back Button 和空格。

于 2014-01-08T03:35:55.240 回答
128

如果您正在使用 Storyboard,您可以转到Attributes InspectorViewController Navigation Item(单击Navigation Bar)并将Back Button属性设置为“”(一个空格字符)。这会将后退按钮标题设置为一个空格字符,使 V 形字可见。无需乱码。

示例图像

请注意,这将为Back ButtonBack Button设置标题,该按钮将与被推到它上面的那个 View Controller 相连接,而不是在这个 Controller 中显示的那个!Back Button

于 2013-11-28T10:57:59.160 回答
120

这对我来说只显示“背面”雪佛龙而没有任何文字:

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

在呈现导航栏的 View Controller中设置此属性,viewDidLoad它就可以解决问题。

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

于 2013-10-29T00:43:44.277 回答
28

在此处输入图像描述

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

故事板

在此处输入图像描述

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

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

代码

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,无代码)

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

在此处输入图像描述

于 2016-05-20T02:59:42.080 回答
27

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

- 编辑 -

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

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

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

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

于 2013-09-29T16:26:45.780 回答
15
self.navigationController.navigationBar.topItem.title = @"";
于 2015-08-05T22:09:16.577 回答
11

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

只需调用一次:

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

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

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

于 2013-10-22T15:37:05.507 回答
10

我提供的答案并没有取得很大的成功,但我确实找到了一个非常简单的解决方法。在情节提要中,您可以单击 UIViewController 的导航项并设置后退按钮文本。我将它设置为单个“”空间,它给了我我正在寻找的行为。在此处输入图像描述

于 2014-04-25T22:11:56.703 回答
10

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

self.navigationController?.navigationBar.topItem?.title = ""
于 2017-02-24T21:08:28.113 回答
6

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

覆盖UINavigationBar类并添加这行代码:

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

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

希望这可以帮助

于 2014-07-04T10:45:58.487 回答
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 = @" ";

因为您的标题视图是自定义视图,所以在导航堆栈中移回时不会被覆盖。

于 2013-12-06T09:01:39.257 回答
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 测试了这个。在其他情况下可能会有额外的意外行为。

于 2015-04-28T15:58:28.307 回答
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";
}

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

于 2013-10-29T05:02:57.783 回答
4

斯威夫特 3

navigationController?.navigationBar.topItem?.title = ""
于 2017-03-12T09:16:23.543 回答
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];
于 2014-01-09T08:23:14.463 回答
3

没有一个答案对我有帮助。但是有一个技巧 - 我只是在按下它之前清除了按下的视图控制器的标题(后退按钮要去的地方)。

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

viewWillAppear推送视图中,我放回了原来的标题。

于 2013-10-16T12:56:46.983 回答
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
于 2015-07-06T03:35:46.283 回答
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];
于 2015-10-28T06:46:40.783 回答
2

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

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}
于 2016-10-19T09:42:03.430 回答
2

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

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
于 2016-03-27T07:59:02.033 回答
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
    }
于 2017-11-06T11:40:20.703 回答
1

你也可以使用这个:

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

[temporaryBarButtonItem release];

这对我有用

于 2014-05-06T11:01:22.727 回答
1

只需为后退按钮导航项输入一个空格即可!

于 2017-02-02T19:46:06.560 回答
1

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

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

似乎如果它没有被呈现,那么无论它会尝试显示一个标题,这意味着它在被绘制并解决问题之前被显示然后隐藏。

于 2017-05-12T22:33:04.190 回答
1

如果你想在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

2021 年更新:使用NXNavigationExtension

于 2018-07-13T11:42:03.370 回答
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)
    }
}
于 2017-12-29T08:57:10.987 回答
1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }
于 2015-09-18T07:21:01.650 回答
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的标题,以便标题总是在视图出现之前更新(以防它被这样的技巧删除)。

于 2016-04-19T15:54:42.387 回答
1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}
于 2017-06-27T10:46:45.900 回答
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
}
于 2016-03-31T02:44:32.870 回答
0

使用 Guto Araujo 的回答我无法让它工作navigationBar.topItem.title = @"";

但是,通过在视图控制器self.title = @""的方法中进行设置,我能够获得所需的效果。(设置它很重要,不会起作用。)initinitviewDidLoad

于 2014-07-02T21:05:36.143 回答
0

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

编辑:

.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);
    }
}
于 2017-09-11T10:03:53.480 回答
0

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

迅速:

UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)

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

于 2017-09-27T07:45:30.117 回答
0

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

override func viewDidLoad() {
super.viewDidLoad()   



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

 let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)  // 2

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

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



}
于 2016-03-31T07:14:42.630 回答
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"像往常一样写,当推一个新的UIViewController.

于 2017-09-07T08:27:38.697 回答
-1

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

self.navigationItem.title=@"";

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

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

-(void)viewWillDisappear:(BOOL)animated
{
    self.navigationItem.title=@"";
}
于 2017-05-26T13:08:03.193 回答
-3

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

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000)
                                                     forBarMetrics:UIBarMetricsDefault];
于 2014-07-29T10:59:20.863 回答
-3

这在 iOS 7+ 中对我有用:

在 viewDidLoad 中:

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

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

于 2014-10-20T16:36:38.797 回答