UINavigationBar隐藏按钮文本

Nil*_*ils 94 uinavigationcontroller ios

如何从UINavigation控制器隐藏后退按钮文本?我只会有"<"而不是"<Back"

reb*_*o95 99

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

也可以使用以下代码更改它:

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

或者在Swift中:

self.navigationItem.backBarButtonItem?.title = ""

  • 接口构建器和Swift编程路由在XCode 8.3.2,Swift 3中对我不起作用 (8认同)
  • 该方法目前仅适用于界面生成器。从代码中设置它不起作用,而不是仅设置标题,您需要设置整个 backBarButtonItem,如下所示: navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) (4认同)
  • 很棒的提示,关于在界面构建器上设置空白的一个... :-D (2认同)
  • 如果IB中的“后退按钮”已经为空白,则只需添加一个空格即可乘坐“后退”并仅显示箭头。 (2认同)

Sha*_* KS 80

你也可以通过故事板来做到这一点.在上一个控制器的导航项的属性检查器中,您可以在后退按钮字段中设置"".请参阅下面的图片 将"您的标题"替换为"".通过这样做,您将获得所需的结果.你不需要再乱用'Title'了.

以编程方式你可以使用

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

其中自我指推你需要的视图控制器控制器.

Xcode视图控制器导航项

示例之前,导航栏之后

之前 之前

后

  • 在iOS 9/Xcode 7.3中,以编程方式设置`backBarButtonItem`不起作用,但通过故事板设置它. (10认同)
  • 如果它设置在故事板中,这将完美地工作.只需确保导航栏中包含导航项,以便进行设置. (7认同)

小智 69

您可以像这样实现UINavigationControllerDelegate:

老SWIFT

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

SWIFT 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
    }
}
Run Code Online (Sandbox Code Playgroud)

}

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

  • 谢谢!在查看4个重复问题和数十个答案后,这是唯一有效的解决方案(不会弄乱任何其他内容). (6认同)

jac*_*kal 41

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

Objective-C的

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

迅速

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

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

  • 谢谢,它的确有效!在swift中:self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"",style:.Plain,target:nil,action:nil) (2认同)

Ada*_*lan 29

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

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

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

此解决方案将文本渲染为一个小的清晰点,类似于手动设置后退按钮标题@" ",除了它影响所有导航栏按钮.

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

要选择何时显示标题,可以根据需要手动恢复标题文本属性,或者创建UIBarButtonItem相同的子类(可能与另一个UIAppearance代理).

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

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

  • 这是否也掩盖了不是后退按钮的左栏按钮项目? (3认同)
  • 它不应该影响导航栏中的所有其他按钮,包括左/右栏按钮项吗? (2认同)

alo*_*nes 29

在viewDidLoad或loadView中添加以下代码

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

我用iOS 9在iPhone和iPad上测试过

  • 这还不清楚以前的视图控制器的标题? (19认同)
  • 不要使用,因为它将删除最后一个屏幕标题 (4认同)
  • 目前只为我工作 (2认同)

ter*_*dyl 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
Run Code Online (Sandbox Code Playgroud)

PS - (我不知道如何使这个扩展工作与Swift,它有奇怪的错误.编辑欢迎添加一个Swift版本)


小智 9

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

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

要么

manualLy在故事板中,选择视图控制器上的导航栏,并在后面的按钮文本中放入"".

这会奏效.谢谢

  • 这个也将删除导航项标题 (2认同)

小智 9

唯一没有副作用的是创建自定义后退按钮.只要您不提供自定义操作,即使幻灯片手势也能正常工作.

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

不幸的是,如果你想要的所有后退按钮都没有任何标题,你需要在所有视图控制器中设置这个自定义后退按钮:/

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*aze 8

目前的答案没有奏效.我想完全删除标题,但文本"返回"并没有消失.

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

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

当前一个视图控制器没有标题时才有效


cat*_*ore 8

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

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

  • 如果您需要从当前视图控制器执行此操作,那么为了避免从以前的 vc 中删除标题,您应该这样做: navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil,行动:无) (3认同)

小智 7

雨燕5

viewController.navigationItem.backButtonDisplayMode = .minimal
Run Code Online (Sandbox Code Playgroud)

  • 适用于 iOS 14.0+ (4认同)

Ang*_*qui 6

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

长按后退按钮时列表为空

相反,您可以使用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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需要在呈现视图控制器时调用该方法,因此要么从基类(viewWillAppear例如 on)调用它,要么向导航控制器添加一些委托,就像本文的其他答案中一样。


小智 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()
    }

}
Run Code Online (Sandbox Code Playgroud)

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


Sat*_*ync 5

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

斯威夫特 4:

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

  • 是的!谢谢 :) (2认同)