UINavigationBar 隐藏按钮文本

Posted

技术标签:

【中文标题】UINavigationBar 隐藏按钮文本【英文标题】:UINavigationBar Hide back Button Text 【发布时间】:2014-07-14 06:04:15 【问题描述】:

如何隐藏 UINavigation 控制器的后退按钮文本? 我只会有“

【问题讨论】:

你不能修改默认文本,而是尝试使用navigationItem.leftBarButtonItem设置自定义返回按钮 ***.com/questions/1453519/… 如果您想要使用外观代理的全局解决方案,请参阅下面的答案。 【参考方案1】:

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

也可以用这行代码改变它

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

或者在 Swift 中:

self.navigationItem.backBarButtonItem?.title = ""

【讨论】:

很棒的提示,关于在界面生成器上设置空白空间的提示... :-D 在 XCode 8.3.2、Swift 3 中,接口构建器和 Swift 编程路由对我不起作用 您可以查看我的simple solution 以在应用程序中隐藏所有后退按钮。 P.S.:需要你自己的零行代码 如果 Back Button 在 IB 中已经是空白,只需添加一个空格即可搭乘 Back 并显示箭头。 此方法目前仅在界面生成器中有效。从代码中设置它不起作用,而不是只设置标题,您需要像这样设置整个 backBarButtonItem:navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)跨度> 【参考方案2】:

你可以像这样实现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
    

backBarButtonItem默认是nil,它会影响下一个推送的控制器,所以你只需为所有控制器设置它

【讨论】:

谢谢!在查看了 4 个重复的问题和数十个答案之后,这是唯一有效的解决方案(不会弄乱其他任何东西)。 我已经有一个导航控制器子类,我把它做成了它自己的委托,这很好用。不过应该为 Swift 3 更新。 很好的解决方案,谢谢,唯一对我有用的解决方案。 炒锅就像一个魅力。【参考方案3】:

您也可以通过情节提要来做到这一点。在前一个控制器的导航项的属性检查器中,您可以在“后退”按钮字段中设置“”。请参阅下图。将“您的标题”替换为“”。通过这样做,您将获得所需的结果。你不需要再弄乱“标题”了。

您可以通过编程方式使用

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

其中 self 是指推送您想要的 View 控制器的控制器。

导航栏之前、之后的示例

之前

之后

【讨论】:

如果它设置在故事板中,这将非常有效。只需确保导航栏有一个导航项,以便对其进行设置。 ios 9 / Xcode 7.3 中,以编程方式设置 backBarButtonItem 不起作用,但通过情节提要进行设置。 @ScottGardner,在 iOS 9 中以编程方式设置 backBarButtonItem works for me。 如果你的屏幕中没有导航栏,可能是因为它需要隐藏,你可以在storyboard中添加导航项到前一个视图控制器,并将其后退按钮设置为“”。跨度> 解决方案在 Xcode 9.2/iOS 11 中运行良好且非常容易实现。【参考方案4】:

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

目标-C

[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 的位置)

【讨论】:

谢谢,它有效!迅速: self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) 优秀答案.. 正确指出仅更改默认 backBarButtonItem 的标题是不够的。提到 backBarButtonItem 应该在前一个视图控制器中设置的奖励点。 所以这行得通,但是使用 iOS14 的长按后退按钮,出现的小浮动表格视图不再显示视图控制器的标题;(【参考方案5】:

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

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

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

此解决方案会将文本呈现为一个清晰的小圆点,类似于手动将后退按钮标题设置为 @" ",只是它会影响所有导航栏按钮。

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

要选择何时显示标题,可以根据需要手动恢复标题文本属性,或者创建一个专用的 UIBarButtonItem 子类来做同样的事情(可能使用另一个 UIAppearance 代理)。

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

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

【讨论】:

是我实施的最简单的解决方案。谢谢。 这不是也掩盖了不是后退按钮的左栏按钮项目吗? 是的,我也注意到了。 “它会影响所有导航栏按钮” 不应该影响导航栏中的所有其他按钮,包括左/右栏按钮项吗? 是的,他没有指定更全面的要求。【参考方案6】:

在viewDidLoad或loadView中添加如下代码

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

我在装有 iOS 9 的 iPhone 和 iPad 上对其进行了测试

【讨论】:

这没有清除前一个视图控制器的标题? 不要使用,因为它会删除最后一个屏幕标题 如果您需要从当前视图控制器执行此操作,那么为了避免从以前的 vc 中删除标题,您应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style : .plain,目标:nil,动作:nil)【参考方案7】:

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

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

【讨论】:

如果您需要从当前视图控制器执行此操作,那么为了避免从以前的 vc 中删除标题,您应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style : .plain,目标:nil,动作:nil)【参考方案8】:

您可以添加此 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 版本)

【讨论】:

这给标题“返回”而不是隐藏标题 真的,如何快速override它。很有趣的问题 @teradyl 这是最佳答案。 @Andrey Gagan,看看我的回答 这适用于 iOS 9.0 - 10.3.3,但不适用于 iOS 11+。【参考方案9】:

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

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

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

override func viewDidLoad() 
    super.viewDidLoad()

    setupBackButton()

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

【讨论】:

【参考方案10】:

当前的答案不起作用。我想完全删除标题,但文本“back”并没有消失。

回到上一个视图控制器并设置它的title属性:

self.title = @" ";

在前一个 View Controller 没有标题时起作用

【讨论】:

@ZevEisenberg 确保在视图控制器的生命周期中显示之前设置了属性。意思是在 viewDidLoad 或 viewWillAppear 方法中设置它。 另外,请务必在引号之间添加一个空格 它实际上最终为我工作了没有个空格;只是好的旧空字符串:@"". @ZevEisenberg,当我第一次提出解决方案时,它是在 Xcode 5 的早期版本中。使用空格是它工作的唯一方式,这就是我将它包含在示例代码中的原因。 Xcode 6 更新必须包含它。很高兴知道 - 谢谢 我也使用了我的方法,它仍然有效,实际上也删除了标准的后退箭头。【参考方案11】:

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

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

手动在 storyboards 中,选择视图控制器上的导航栏并在后退按钮文本中添加“”。

这会奏效。谢谢

【讨论】:

这个也会删除 navigationItem 标题 我在 Xcode 9 中编辑了你的答案:self.navigationController?.navigationBar.topItem?.title = " " 并且工作了! 如果您需要从当前视图控制器执行此操作,那么为了避免从以前的 vc 中删除标题,您应该这样做:navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style : .plain,目标:nil,动作:nil)【参考方案12】:

替代方式 - 使用自定义 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 设置自定义类。

【讨论】:

【参考方案13】:

已经有很多答案了,这是我关于这个主题的两分钱。 我发现这种方法非常强大。 你只需要在 segue 之前把它放在 viewController 中。

斯威夫特 4:

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

【讨论】:

是的!谢谢你:)【参考方案14】:

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

Self.title = " "

在返回时再次将标题重置为 viewWillAppear 中的原始标题。

【讨论】:

【参考方案15】:

使用覆盖pushViewController的自定义NavigationController

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)
  

【讨论】:

【参考方案16】:

斯威夫特 5

viewController.navigationItem.backButtonDisplayMode = .minimal

【讨论】:

适用于 iOS 14.0+【参考方案17】:

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

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

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)
    

【讨论】:

【参考方案18】:

这是我对 iOS11 的解决方案,我在 applicationDidFinishLaunchingWithOptions 中更改了 UIBarButtonItem 的外观:

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

不能改变Y偏移,因为iOS11也会改变后退栏按钮的位置,但iOS10及以下可以。

【讨论】:

它可以工作,但是在动画过程中你可以看到之前的标题向左移动。它看起来有点马车。【参考方案19】:

斯威夫特 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

【讨论】:

最佳答案!【参考方案20】:

如果您的目标是 iOS 13 及更高版本,您可以使用this new 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

【讨论】:

这不是最优的。如果用户点击带有明文的标签,仍然会触发返回操作。【参考方案21】:

这里大多数解决方案的问题是,在后面的项目上设置一个空文本不适用于长按后退按钮的新功能。它没有显示正确的标题,而是显示一个空列表

相反,您可以使用iOS14的新按钮显示模式或依赖iOS13的新外观API,将文本设置为0号。请注意,有些人正在使用颜色(透明),这也不起作用,因为它使用了空间并将其从您的标题中删除。如果标题足够长,你会看到它被剪掉了

结果代码:

public extension UINavigationBar 
    func fixAppearance() 
        if #available(iOS 14.0, *) 
            topItem?.backButtonDisplayMode = .minimal
         else if #available(iOS 13.0, *) 
            let newAppearance = standardAppearance.copy()
            newAppearance.backButtonAppearance.normal.titleTextAttributes = [
                .foregroundColor: UIColor.clear,
                .font: UIFont.systemFont(ofSize: 0)
            ]
            standardAppearance = newAppearance
         else 
            topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        
    

然后您只需要在视图控制器出现时调用该方法,因此您可以从基类调用它(例如在 viewWillAppear 上),或者像本文的其他答案一样向导航控制器添加一些委托.

【讨论】:

【参考方案22】:

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


    // ...


【讨论】:

请注意,这也会将您应用中可能包含的所有其他条形按钮的颜色更改为透明,而不仅仅是后退按钮。【参考方案23】:

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

您可以像这样调配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;

【讨论】:

【参考方案24】:

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

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

【讨论】:

对此进行更新:这可行,但加载时有一个奇怪的延迟让我感到困扰。我现在在 App 委托 didLaunchWithOptions 中添加了这个 'let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)',它运行良好!【参考方案25】:

在iOS 11中,我们发现将UIBarButtonItem外观的文字字体/颜色设置为非常小的值或清除颜色会导致其他bar item消失(系统不再支持UIBarButton item的类,它会转换它到_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];

【讨论】:

【参考方案26】:
-(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];

【讨论】:

【参考方案27】:

后面的文字来自上一个View Controller的navigationItem.title,而navigationItem.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(简体中文)

【讨论】:

【参考方案28】:

我的解决方案: - X代码:10.2.1 - 斯威夫特:5

父视图控制器: self.title = "" 子视图控制器: self.navigationItem.title = "Your title" // 设置视图控制器的标题

【讨论】:

【参考方案29】:

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

【讨论】:

【参考方案30】:

UINavigationControllerDelegatenavigationController(_, willShow:, animated:) 方法实现对我有用。

这里是完整的视图控制器源代码。如果您想在整个应用程序中应用此功能,请让所有视图控制器派生自 BaseViewController

class BaseViewController: UIViewController 
    // Controller Actions
    override func viewDidLoad() 
        super.viewDidLoad()
        navigationController?.delegate = self
    

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        updateNavigationBar()
    
    
    //This is for custom back button image.
    func updateNavigationBar() 
        let imgBack = UIImage(named: "icon_back")
        self.navigationController?.navigationBar.backIndicatorImage = imgBack
        self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack
        self.navigationItem.backBarButtonItem = UIBarButtonItem()
    


extension BaseViewController: UINavigationControllerDelegate 
    //This is to remove the "Back" text from back button.
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) 
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem()
    

【讨论】:

以上是关于UINavigationBar 隐藏按钮文本的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 在中断从左边缘手势向右滑动后显示返回按钮,如何隐藏它以及为啥显示它?

UINavigationBar 自定义标题视图

iOS-UINavigationBar颜色设置

更改 UINavigationBar 后退按钮标题

UINavigationBar 后退按钮图标

如何不让按钮仅在 UITabBar 的 5 个选项卡中的 3 个中显示 UINavigationBar?