删除iOS UIBarButtonItem的标题文本

我想要做的是从UIBarButtonItem的“后退”button中删除文本,只留下导航栏上的蓝色人字形。 请记住,我正在为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音乐应用程序中的后退button,只有一个人字形。

谢谢。

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

然后你可以删除后退button项目的标题。

如果您使用故事板,则可以使用空格设置导航属性检视器后退button。

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

Objective-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) 

要清楚的是,这是在视图控制器上完成的,如果你点击后退button,你会看到。 即,而不是看到“<设置”你想看到“<”然后在你的SettingsViewController你会把这个在你的init 。 那么当你看着视图控制器本身时,你不会看到标题中没有显示的任何问题。

如果您正在使用故事板,则可以转到ViewController的Navigation Item Attributes Inspector (单击导航栏),并将Back Button属性设置为“”(一个空格字符)。 这将设置后退button标题为一个空格字符,使雪佛龙可见。 不需要混淆代码。

示例图像

请注意,这将为Back Button设置Back Button标题,该 Back Button标题从前一个button上移到该视图控制器 ,而不是将在此控制器内显示的Back Button

这对我来说只显示没有任何文字的“背”字形:

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

viewDidLoad controller的viewDidLoad中设置这个属性来呈现导航栏,它会执行这个技巧。

注意:我只在iOS 7中进行了testing,这在问题的范围之内。

当你设置button的标题时,使用@“”而不是@“”。

– 编辑 –

当您尝试其他string时是否有任何变化? 我成功地使用了下面的代码:

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

backString是一个variables,设置为@“”或@“后退”,这取决于我是否在iOS 7或更低的版本。

有一件事要注意的是,这个代码不是在我想要自定义后退button的页面的控制器中。 它实际上是在导航堆栈之前的控制器中。

在这里输入图像描述

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

故事板

在这里输入图像描述

从“显示第二个视图控制器”button到第二个视图控制器有一个show segue。

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

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

在故事板上select第一个视图控制器(而不是第二个)的导航项目。 只需input后退button文本的空间。

在这里输入图像描述

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

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

通过简单地调用一次:

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

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

为了删除标题,我会build议Kamaros的答案。 记得在视图控制器上调用这个代码来推动你的新视图控制器。 删除iOS UIBarButtonItem的标题文本

我没有提供很多成功的答案,但我确实find了一个非常简单的解决方法。 在你的故事板中,你可以点击你的UIViewController的导航条目并设置后退button文本。 我把它设置为一个单独的空间,它给了我我正在寻找的行为。 在这里输入图像描述

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

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

简单的解决这个问题,在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 = @" "; 

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

其实你可以用一个技巧来做到这一点:

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

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

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

希望这可以帮助

在第一个ViewController的prepareForSegue:方法中,你将视图标题设置为@“”,所以当下一个视图被按下时,它将显示前面的ViewController标题,它将是@“”。

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

唯一的问题是,当你点击后退button时,以前的视图将不会有标题,所以你可以在viewWillAppear上再次添加它:

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

我不太喜欢这个解决scheme,但它的工作,我没有find其他的方式来做到这一点。

我可以用DonnaLea的答案拼凑一些东西。 这是如何解决scheme出现在我的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中重置标题在转换过程中已经太迟了; 它导致标题回来,而不是很好的animation。 然而,willMoveToParentViewController更快地发生,并允许正确的行为。

警告:我只用普通的UINavigationController push / pop来testing。 在其他情况下可能会有额外的意外行为。

没有答案帮助我。 但一个窍门 – 我只是在按下之前清除了推送的视图控制器(后退button所在的位置)的标题。

所以当前一个视图没有标题时,在iOS 7上,后退button只有一个箭头,没有文字。

在观点上,我把原来的标题放回去了。

  NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [UIColor clearColor],UITextAttributeTextColor, nil]; [[UIBarButtonItem appearance] setTitleTextAttributes:attributes forState:UIControlStateNormal]; 

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

– 编辑 –

这是一个解决scheme,当你真的要删除所有的UIBarbuttonItem标题文本。 如果您只想删除后栏button项目的标题,则没有一个简单方便的解决scheme。 在我的情况下,因为我只有很less的UIBarButtonItems需要显示标题文本我只是改变了这些特定的button的titleTextAttributes。 如果你想更具体的使用下面的代码,这将只会改变导航栏button:

 NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [UIColor clearColor],UITextAttributeTextColor, nil]; [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes forState:UIControlStateNormal]; 

这是使用子类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 
 [[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]; 

SWIFT 3

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

这是我在做我,这是更简单的删除后退button的标题

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

你也可以使用这个:

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

这对我有用

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

隐藏导航栏的后退button标题

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

完美的解决scheme

 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 } 

我为UINavigationController创build一个自定义的类,并将其应用到我的应用程序中的所有导航控制器。 在这个自定义的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; } 

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

如果像我一样,你使用的是自定义视图而不是UINavigationBar并且你被后退button卡住了,那么你必须做一些工作,感觉有点乱七八糟。

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

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

我已经做了一个非常简单的零configuration类别来隐藏所有后退button标题通过了应用程序,你可以在这里检查出来。 这个问题已经接受了答案,但是对于其他人可能会有所帮助。

编辑:

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

我无法使用Guto Araujo的navigationBar.topItem.title = @"";

不过,我可以通过在我的视图控制器的init方法中设置self.title = @""来获得所需的效果。 (在init设置很重要, viewDidLoad不起作用。)

我列出了迄今为止为我工作的解决scheme。

 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 } 

只需input一个单一的空间为后退button导航项目工作!