UINavigationBar隐藏按钮文字


Answers:


107

在界面构建器中,您可以选择上一个控制器的导航项,并将Back Button字符串更改为希望后退按钮显示为的字符串。例如,如果您希望它为空白,则只需放置一个空格。

还可以使用以下代码行对其进行更改

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

或在Swift中

self.navigationItem.backBarButtonItem?.title = ""


2
很棒的技巧,关于在界面生成器上设置空白的技巧... :-D
Felipe Ferri

9
接口构建器和Swift编程路线在XCode 8.3.2,Swift 3
agrippa

您可以查看我非常简单的解决方案,以隐藏整个应用程序中的所有后退按钮。PS:需要您自己的零代码行
Pratik Jamariya

2
如果Back Button在IB中已经为空,则只需添加一个空格即可,Back然后显示箭头。
Tejas K

3
该方法当前仅在界面生成器中有效。从代码中设置此方法无效,而不是仅设置标题,您需要像这样设置整个backBarButtonItem:navigationItem.backBarButtonItem = UIBarButtonItem(title:“”,style:.plain,target:nil,action:nil)
Leszek Szary

81

您也可以通过情节提要进行此操作。在上一个控制器的导航项目的属性检查器中,可以在“后退”按钮字段中设置“”。请参阅下面的图像。将“此处的标题”替换为“”。这样,您将获得所需的结果。您无需再理会“标题”。

您可以以编程方式使用

[self.navigationItem.backBarButtonItem setTitle:@" "];

其中self是指可以推动所需View控制器的控制器。

Xcode视图控制器导航项

导航栏之前,之后的样本

之前 之前

后


7
如果将其设置在情节提要中,则效果很好。只要确保导航栏中有一个导航项,就可以对其进行设置。

11
在iOS 9 / Xcode 7.3中,backBarButtonItem无法以编程方式进行设置,但可以通过情节提要进行设置。
Scott Gardner

@ScottGardner,设定backBarButtonItem编程工作对我来说在iOS的9
Suragch

如果屏幕上没有导航栏,可能是因为它需要隐藏,因此可以将情节提要中的导航项添加到上一个视图控制器,并将其后退按钮设置为“”。
Martin Berger

解决方案在Xcode 9.2伟大的工作,很容易实现/ iOS的11
雷亨特

78

您可以这样实现UINavigationControllerDelegate

较早的斯威夫特

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

斯威夫特4.x

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }
}

backBarButtonItemnil默认设置,它会影响下一个推送的控制器,因此您只需为所有控制器进行设置


6
谢谢!在查看了4个重复的问题和数十个答案之后,这是唯一有效的解决方案(不弄乱其他任何内容)。
inket 2016年

1
我已经有一个导航控制器子类,可以将其做成自己的委托,这很完美。应该为Swift 3更新。
迪恩·凯利

很棒的解决方案,谢谢,这是唯一为我持续工作的解决方案。
Elliott Davies

像个魅力似的。
tounaobun

47

将后退按钮的标题设置为@""nil不起作用。您需要将整个按钮设置为空(没有标题或图像):

物镜

[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];

迅速

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

这应该在导航堆栈中位于视图控制器顶部的视图控制器上完成(即,通过pushViewController方法从那里导航到VC )


2
谢谢,它有效!快速:self.navigationItem.backBarButtonItem = UIBarButtonItem(title:“”,style:.Plain,target:nil,action:nil)
mostworld77 '16

30

对于具有大量视图控制器的情况,此问题的另一种解决方案是使用UIAppearance代理有效地隐藏后退按钮标题文本,如下所示:

UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

此解决方案会将文本呈现为微小的清晰点,类似于将后退按钮标题手动设置为@" ",不同之处在于它会影响所有导航栏按钮。

我不建议将其作为此问题的一般解决方案,因为它会影响所有导航栏按钮。它将翻转范例,以便您选择何时显示按钮标题,而不是何时隐藏标题。

要选择显示标题的时间,请根据需要手动恢复标题文本属性,或创建一个UIBarButtonItem与之相同的专用子类(可能与另一个UIAppearance代理一起使用)。

如果您有一个需要隐藏大多数后退按钮标题的应用程序,而导航按钮中只有少数(或没有)是带有标题的系统按钮,那么这可能适合您!

(注意:即使文本颜色清晰,也需要更改字体大小,以确保长标题不会导致中心导航栏标题移到上方)


对于我的实现而言,这是最简单的解决方案。谢谢。
Trevor Panhorst,2016年

3
这是否还掩盖了不是后退按钮的左栏按钮项目?
凯文·2016年

1
是的,我也注意到了。“它会影响所有导航栏按钮”
Adam Kaplan,

2
它不应该影响导航栏中的所有其他按钮,包括左右按钮的项目吗?
Fyodor Volchyok '18

是的,他没有指定更全面的要求。
亚当·卡普兰

30

在viewDidLoad或loadView中添加以下代码

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

我在iOS 9的iPhone和iPad上进行了测试


20
这没有清除以前的视图控制器的标题吗?
CalZone

6
不要使用,因为它会删除最后一个屏幕标题
evya

如果您需要从当前的视图控制器执行此操作,则应避免从以前的vc中删除标题,而应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title:“”,style:.plain,target:nil,动作:无)
莱谢克Szary

15

您可以添加这个Objective-C类别,以使导航控制器创建的所有“后退”按钮都没有文本。我刚刚将其添加到我的AppDelegate.m文件中。

@implementation UINavigationItem (Customization)

/**
 Removes text from all default back buttons so only the arrow or custom image shows up.
 */
-(UIBarButtonItem *)backBarButtonItem
{
    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

PS-(我不知道如何使此扩展程序与Swift一起使用,它存在奇怪的错误。欢迎进行编辑以添加Swift版本)


这使标题为“ Back”而不是隐藏标题
Raj Aggrawal

真的,如何override迅速。非常有趣的问题
Andrey Gagan

@teradyl最好的答案。
aks.knit1108 '17

@安德烈·加根(Andrey Gagan),请参阅我的答案
阿比拉米巴拉(Abirami Bala)

此功能适用于iOS 9.0-10.3.3,但不适用于iOS 11+。
西哈德·贝戈维奇

14

我在上面和下面尝试了一些,但是它们没有用。这对我有用:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = ""
}

1
如果您需要从当前的视图控制器执行此操作,则应避免从以前的vc中删除标题,而应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title:“”,style:.plain,target:nil,行动:无)
Leszek Szary

11

没有副作用的唯一方法是创建一个自定义后退按钮。只要您不提供自定义操作,即使滑动手势也可以使用。

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

不幸的是,如果您希望所有后退按钮都没有标题,则需要在所有视图控制器中设置此自定义后退按钮:/

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

将标题设置为空白而不是空字符串非常重要。


9

以编程方式从后退按钮中删除文本,请在下面的代码中使用,它将在xcode7及更高版本中起作用。

self.navigationController.navigationBar.topItem.title = @“”;

要么

在情节提要中,在视图控制器上选择导航栏,然后在后退按钮文本中放置“”。

这将起作用。谢谢


2
这一次将删除navigationItem标题太
Ilker Baltaci

我编辑了您对此的答案:self.navigationController?.navigationBar.topItem?.title = " "在Xcode 9中工作了!
MHSFisher '18年

如果您需要从当前的视图控制器执行此操作,则应避免从以前的vc中删除标题,而应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title:“”,style:.plain,target:nil,行动:无)
Leszek Szary

8

当前答案无效。我想完全删除标题,但文本“ back”并没有消失。

返回上一个视图控制器并设置其title属性:

self.title = @" ";

在以前的View Controller没有标题时有效


@ZevEisenberg确保在视图控制器的生命周期中显示该属性之前对其进行设置。含义是在viewDidLoad或viewWillAppear方法中进行设置。
克里斯·海兹(ChrisHaze)2015年

1
另外,请确保在引号之间包含一个空格
克里斯·海兹(ChrisHaze)2015年

1
实际上,它最终对我没有空间了。只是好旧的空字符串:@""
Zev Eisenberg 2015年

1
@ZevEisenberg,当我第一次提出解决方案时,它早于Xcode5。只有空格是它起作用的唯一方法,这就是为什么我将其包含在示例代码中。Xcode 6更新必须包含它。众所周知
-thx

我还使用了仍然有效的方法,实际上也删除了标准的后退箭头。
克里斯·海兹(ChrisHaze)2015年

5

另一种方法-使用自定义NavigationBar类。

class NavigationBar: UINavigationBar {

    var hideBackItem = true
    private let emptyTitle = ""

    override func layoutSubviews() {
        if let `topItem` = topItem,
            topItem.backBarButtonItem?.title != emptyTitle,
            hideBackItem {
            topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
        }

        super.layoutSubviews()
    }

}

也就是,此删除标题整个项目。只需为UINavigationController设置自定义类。


4

将上一个VC的标题设置为带有空格的“”字符串。和带有后退按钮的标题将被替换为单个空格字符串。

Self.title = " "

在返回上再按一次,可将标题重置为viewWillAppear中的原始标题。


4

使用NavigationController覆盖的自定义pushViewController

class NavigationController: UINavigationController {  
  override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.backBarButtonItem =
      UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    super.pushViewController(viewController, animated: animated)
  }
}

4

已经有很多答案了,这是我关于这个问题的两分钱。我发现这种方法确实很健壮。您只需要在segue之前将其放入viewController中即可。

斯威夫特4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

2
是! 谢谢您:)
Hews

3

我尝试了这篇文章中的所有内容。唯一有效的解决方案是@VoidLess

这是相同的答案,但更完整

class CustomNavigationController: UINavigationController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.delegate = self
    }
}


// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    }
}

3

这是我的iOS11分辨率,我更改了applicationDidFinishLaunchingWithOptions中的UIBarButtonItem的外观:

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)

您无法更改Y偏移,因为它也会在iOS11中更改后退栏按钮的位置,但在iOS10及以下版本中可以。


1
它可以工作,但是在动画过程中,您可以看到前一个标题向左移动。看起来有点越野车。
乔纳森

2

在Swift3中,

如果设置全局设置

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // ..

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


    // ...

}

1
请注意,这还会将您可能在应用程序中某处的所有其他条形按钮(不仅是后退按钮)的颜色更改为透明。
Leszek Szary

2

Swift 3.1 您可以通过实现UINavigationController的委托方法来实现。

func navigationController(_ navigationController: UINavigationController, 
                          willShow viewController: UIViewController, animated: Bool) {

    /** It'll hide the Title with back button only,
     ** we'll still get the back arrow image and default functionality.
     */
    let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                               action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

最好的答案!
evya

2

对于那些想要全局隐藏后退按钮标题的人。

您可以调配viewDidLoadUIViewController这样。

+ (void)overrideBackButtonTitle {

    NSError *error;

    // I use `Aspects` for easier swizzling.

    [UIViewController aspect_hookSelector:@selector(viewDidLoad)
                              withOptions:AspectPositionBefore
                               usingBlock:^(id<AspectInfo> aspectInfo)
    {

        UIViewController *vc = (UIViewController *)aspectInfo.instance;

        // Check whether this class is my app's view controller or not.
        // We don't want to override this for Apple's view controllers,
        // or view controllers from external framework.

        NSString *className = NSStringFromClass([vc class]);
        Class class = [NSBundle.mainBundle classNamed:className];
        if (!class) {
           return;
        }

        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
        vc.navigationItem.backBarButtonItem = backButton;

    } error:&error];

    if (error) {
        NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
    }

}

用法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[self class] overrideBackButtonTitle];
    return YES;
}

2

如果你的目标iOS的13,以后你可以使用这个新的API,以全球隐藏后退按钮标题

let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance

1
这不是最佳的。如果用户点击带有明文的标签,则仍会触发后退操作。
dvdblk

1

我为此苦苦挣扎,因为我有一个自定义的导航控制器。我可以使用自定义导航控制器类中的代码删除所有视图控制器中的后项文本。 override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }

这将使用此自定义导航控制器删除所有后面的项目标题。


1
为此更新:这行得通,但加载时有一个奇怪的滞后令我困扰。我现在在应用程序委托didLaunchWithOptions中添加了“让BarButtonItemAppearance = UIBarButtonItem.appearance()BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear],for:.normal)”,它运行良好!
Amy.R,

0

在iOS 11中,我们发现将UIBarButtonItem外观的文本字体/颜色设置为非常小的值或清除颜色将导致其他条项目消失(系统不再使用UIBarButton项目的类,它将转换为_UIModernBarButton)。将反向文本的偏移量设置为屏幕外也会在交互式弹出过程中导致闪烁。

因此我们陷入困境addSubView

+ (void)load {
    if (@available(iOS 11, *)) {
        [NSClassFromString(@"_UIBackButtonContainerView")     jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
    }
}

- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
    view.alpha = 0;
    if ([view isKindOfClass:[UIButton class]]) {
        UIButton *button = (id)view;
        [button setTitle:@" " forState:UIControlStateNormal];
    }
    [self MyiOS11BackButtonNoTextTrick_addSubview:view];
}

0
-(void)setNavigationItems{
     UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];   
     self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
    [self.navigationController popViewControllerAnimated:YES];
}

0

后面的文本来自最后一个View Controller的navigationItem.titlenavigationItem.title并由自动设置self.title。钩子是解决问题的简便方法setTitle:,请确保navigationItem.title = @""

随意编写此代码即可AppDelegate.m

    [UIViewController aspect_hookSelector:@selector(setTitle:)
                              withOptions:AspectPositionAfter
                               usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
        UIViewController *vc = aspectInfo.instance;
        vc.navigationItem.titleView = ({
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
            titleLabel.text = title;
            titleLabel;
        });
        vc.navigationItem.title = @"";
    } error:NULL];

有关更多详细信息,访问https://www.jianshu.com/p/071bc50f1475(简单中文)


0

我的解决方案:-XCode:10.2.1-Swift:5

  • 父视图控制器:
    • self.title =“”
  • 子视图控制器:
    • self.navigationItem.title =“您的标题” //为视图控制器设置标题

0

XCode 11.5迅捷5

如果您不需要自定义后退按钮,那么一种非常简单的方法(虽然可能有点怪异)可以通过编程方式执行此操作,即在您要推入堆栈的视图控制器中将字体大小设置为零。从viewDidLoad

private func setupNavBar() {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithDefaultBackground()
    
    let backButtonAppearance = UIBarButtonItemAppearance()
    backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
    appearance.backButtonAppearance = backButtonAppearance

    navigationItem.standardAppearance = appearance
    navigationItem.scrollEdgeAppearance = appearance
    navigationItem.compactAppearance = appearance
}

-1

终于找到了完美的解决方案,可以在整个应用程序中隐藏默认的后退文本。

只需添加一个透明图像,然后在AppDelegate中添加以下代码即可。

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

-2

以下方法可在iOS 11上使用,并且可以确保不会在其他iOS版本上崩溃。这样做可能会使您的应用在App Store审查中被拒绝,因为UIModernBarButton和UIBackButtonContainerView都是私有API。放在AppDelegate中。

    if
        let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
        let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {

        let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
        backButton.setTitleColor(.clear, for: .normal)
    }

这样做可能会使您的应用在App Store审查中被拒绝,因为UIModernBarButton和UIBackButtonContainerView都是私有API。
Groot

感谢@Groot,添加了您的警告。
帕特里克

-5

Swift版本,在全球范围内均可完美运行:

 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
    }

7
您应该添加,这将同时隐藏所有文本rightBarButtons和leftBarButtons,它们不会返回。
limfinity

这不是一个solution。作为@limfinity指出,这将普遍改变了所有的UIBarButtonItem的整个应用程序
Danut Pralea

我同意@limfinity和Danut Pralea的观点,它将在整个应用程序中隐藏所有UIBarButtonItem的文本
Pratik Jamariya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.