首页 文章

删除iOS UIBarButtonItem的 Headers 文本

提问于
浏览
192

我想要做的是从 UIBarButtonItem 的'Back'按钮中删除文本,只在导航栏上留下蓝色V形符号 . 请记住,我已经尝试了几种方法,包括但不限于:

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

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形 .

谢谢 .

30 回答

  • 3

    我无法回答 navigationBar.topItem.title = @"";

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

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

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

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

  • 403

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

    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)
    

    To be clear, this is done on the view controller that you would see if you hit the back button. 即不是看到'< Settings',而是想看到'<'然后在你的SettingsViewController上你会把它放在 init 中 . 然后你不要看着视图控制器本身 .

  • 5

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

    example image

    请注意,这将设置 Back Button title for the Back Button that will segue to this View Controller 来自其顶部的那个,而不是将在此Controller内显示的 Back Button

  • 1

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

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

    在视图控制器的 viewDidLoad 中设置此属性,显示导航栏,它将执行此操作 .

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

  • 2

    当您设置按钮的 Headers 时,请使用@“”而不是@“” .

    • 编辑 -

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

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

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

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

  • 6

    enter image description here

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

    Storyboard

    enter image description here

    从“显示第二视图控制器”按钮到第二视图控制器有一个show segue .

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

    Code

    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

  • 1
    self.navigationController.navigationBar.topItem.title = @"";
    
  • 126

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

    只需拨打一次:

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

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

    为了删除 Headers ,我的答案是'll suggest Kamaros' . 请记住在推动新视图控制器的视图控制器上调用此代码 . Removing the title text of an iOS UIBarButtonItem

  • 0

    我没有't have a lot of success with the provided answers but I did find a really simple work around. In your storyboard, you can click on your UIViewController'导航项目并设置后退按钮文本 . 我将它设置为一个' '空间,它给了我正在寻找的行为 .
    enter image description here

  • 122

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

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

    在iOS7和6上工作的这个问题的简单解决方案是在viewDidLoad中设置自定义 Headers 视图:

    - (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 = @" ";
    

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

  • 3

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

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

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

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

    希望这可以帮助

  • 6

    在您的第一个ViewController的prepareForSegue:方法中,您将 Headers 视图设置为@“”,所以当下一个视图被推送它将显示以前的ViewController Headers ,它将是@“” .

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

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

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

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

  • 3

    我用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
        }
    }
    

    原始答案的问题是,当您弹回它时,它会从控制器中删除 Headers . 尝试在viewWillDisappear中重置 Headers 在转换过程中为时已晚;它会使 Headers 快速恢复而不是动画效果 . 但是,willMoveToParentViewController发生得更快,并允许正确的行为 .

    警告:我只用普通的UINavigationController push / pop测试过这个 . 在其他情况下可能会有其他意外行为 .

  • 10

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

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

    在推送视图的 viewWillAppear 上,我放回了原始 Headers .

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

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

    • 编辑 -

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

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

    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

    这是使用子类 navigationController 删除"Back" .

    我正在使用它来永久地通过应用程序将其删除 .

    //.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
    
  • 1
    [[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];
    
  • 24

    SWIFT 3

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

    隐藏导航栏的后退按钮 Headers

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

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

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

    你也可以用这个:

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

    这适合我

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

    全球完美解决方案

    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
    }
    
  • 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;
    }
    

    这样我只需将我的自定义类分配给我的所有导航控制器,它就会清除所有后退按钮的 Headers . 为了清楚起见,我总是为 viewWillAppear 中的所有其他视图控制器设置 Headers ,以便在视图出现之前始终更新 Headers (如果它被这样的技巧删除) .

  • 1

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

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

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

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

    这是更好的解决方案 .

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

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

相关问题