删除iOS UIBarButtonItem的标题文本

Pan*_*yue 197 uinavigationbar uibarbuttonitem uinavigationitem ios

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

这是我不喜欢的图像方法(图像看起来不合适):

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

我试过的另一种方法是这个,它根本不起作用(没有显示):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;
Run Code Online (Sandbox Code Playgroud)

我想要实现的是像iOS 7音乐应用程序中的后退按钮,它只有一个单一的V形.

谢谢.

Don*_*Lea 411

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

Objective-C的:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
Run Code Online (Sandbox Code Playgroud)

迅速:

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Run Code Online (Sandbox Code Playgroud)

要清楚,这是在视图控制器上完成的,如果按下后退按钮,您将看到它.即,而不是看到'<设置',你只想看到'<'然后在你的SettingsViewController上,你会把它放在你的init.然后,当您查看视图控制器本身时,不会显示标题的任何问题.

  • 在这个帖子的13个答案中,这是唯一一个正常运行的答案.谢谢! (34认同)
  • @BenjaminPiette你是否在UIViewController上调用它,如果你点击后退按钮你会看到它?不是显示后退按钮的UIViewController. (15认同)
  • 还使用雨燕的人,这是navigationItem.backBarButtonItem =的UIBarButtonItem(标题: "",风格:.Plain,目标:无,作用:无).从Obj-C转换到Swift并不难,但我会为你节省麻烦 (8认同)
  • 在iOS 8上也不适用于我. (5认同)
  • 多么优雅的解决方案!谢谢.做偏移的事情感觉不对. (2认同)
  • 如果您在导航堆栈中的先前控制器上编写此行代码,此解决方案将非常有效. (2认同)

小智 198

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 大标题存在问题:它们不是居中但是向右推,就像后退按钮文本仍然存在一样 (95认同)
  • 我认为这是一个更好的答案:`[[UIBarButtonItem外观] setTitleTextAttributes:@ {NSForegroundColorAttributeName:[UIColor clearColor]} forState:UIControlStateNormal];` (22认同)
  • 任何带有幻数的解决方案都是个坏主意.随着自动布局,大小类,可访问性功能等的推动.使用像这样的常量值必然会咬你. (18认同)
  • 如果用户已打开"辅助功能 - 按钮形状",则此功能无效 (11认同)
  • 要改进benjamin的注释,你也应该为`UIControlStateHighlighted`设置它 (3认同)
  • 我想面对使用它的人,现在来到iOS 11:D (2认同)
  • 如果在iOS 11中使用它,请小心!它会导致`UIViewAlertForUnsatisfiableConstraints`,你可能会失去很多时间来寻找问题的根源. (2认同)

Nik*_*kin 128

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

示例图片

请注意,这将设置后退按钮的Back Button标题,该后退按钮将从在其上推动的视图控制器中切换到该视图控制器,而不是Back Button将在此控制器内显示的那个!

  • 我希望我可以更多地支持这一点:"请注意,这将设置后退按钮的后退按钮标题,该按钮将转换到此视图控制器上形成的按钮,而不是将显示在此内部的后退按钮控制器!" (10认同)

Gut*_*ujo 122

这对我来说只显示没有任何文字的'后'雪佛龙:

self.navigationController.navigationBar.topItem.title = @"";
Run Code Online (Sandbox Code Playgroud)

viewDidLoad在视图控制器中设置此属性,显示导航栏,它将完成这一操作.

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

  • 这具有删除导航栏中间的标题标签的副作用. (32认同)
  • 使用相同的属性在'viewWillAppear'上设置推送VC的标题.这样就不会删除它. (7认同)
  • 我将那段代码移动到VC的```-viewDidLoad```,我不想要Back文本.然而,我后来发现的是,当我从```navigationController```弹出第二个VC时,标题文本很快就会出现,而不是立即出现.我想一个视频会更好地说明这一点,所以这里是:[link](https://statixind.net/downloads/personal/stkovrf.mov) (5认同)

Kam*_*ros 27

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

- 编辑 -

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

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
Run Code Online (Sandbox Code Playgroud)

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

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


Sur*_*gch 27

在此输入图像描述

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

故事板

在此输入图像描述

从"显示第二视图控制器"按钮到第二视图控制器有一个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)
    }
}
Run Code Online (Sandbox Code Playgroud)

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}
Run Code Online (Sandbox Code Playgroud)

替代方法(仅限IB,无代码)

在故事板上选择第一个视图控制器的导航项(而不是第二个).只需为后退按钮文本输入空格即可.

在此输入图像描述


Cla*_*tro 15

self.navigationController.navigationBar.topItem.title = @"";
Run Code Online (Sandbox Code Playgroud)

  • 如果childViewController在NavigationController的子堆栈中处于深度2+,这是唯一的解决方案 (2认同)
  • 这也将删除前一个视图控制器的标题.在大多数情况下,这会很糟糕 (2认同)

DZe*_*Bot 11

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

只需拨打一次:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
Run Code Online (Sandbox Code Playgroud)

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

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


Gra*_*mbo 10

我提供的答案并没有取得很大的成功,但我找到了一个非常简单的工作.在故事板中,您可以单击UIViewController的导航项并设置后退按钮文本.我将它设置为一个单独的空间,它给了我正在寻找的行为.在此输入图像描述


小智 10

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

self.navigationController?.navigationBar.topItem?.title = ""
Run Code Online (Sandbox Code Playgroud)


Mat*_*hes 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;
}
Run Code Online (Sandbox Code Playgroud)

然后,在viewWillAppear中:你可以安全地打电话

self.navigationController.navigationBar.topItem.title = @" ";
Run Code Online (Sandbox Code Playgroud)

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


ror*_*ulu 6

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

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

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助


Bra*_*adB 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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