如何删除所有导航栏后退按钮标题

jan*_*sma 73 uibarbuttonitem ios swift

当我按下它时UIViewController,它在新的后退按钮中有一些标题UIViewController,如果标题有很多文本,它在iPhone 4s看起来不太好所以我想删除它.

如果我在prepareForSegue函数中添加一些代码,那将是一个麻烦.

有没有更好的方法实现这一目标

Nim*_*ekh 121

如果你想要后退箭头,那么将代码放入AppDelegate文件中的didFinishLaunchingWithOptions方法.

For Objective-C

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

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
Run Code Online (Sandbox Code Playgroud)

下面给出另一个选择.

Objective C

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

Swift

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

更新:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
Run Code Online (Sandbox Code Playgroud)

更新SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
Run Code Online (Sandbox Code Playgroud)

使用偏移量

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
Run Code Online (Sandbox Code Playgroud)

所以可能你的问题已经解决了.

快乐的编码.

  • `setBackButtonTitlePositionAdjustment`并不总是有效,当后退按钮标题很长,但不足以改为"后退"时,中间的标题将向右移动. (8认同)
  • 这里只是一点精度,标题属于PREVIOUS视图控制器.所以记得在presentViewController或pushViewController方法之前设置它. (8认同)
  • @zgjie它只是你的偏移量有多大的主题.您可以轻松地将'-60'替换为'-6000'并忘记此问题 (3认同)
  • @DominikBucher我已经为这个行为做了一个类别,它隐藏了应用程序中每个位置的按钮标题,有点["NON HACKY"方式](/sf/answers/3230712131/),只需添加您项目中的类别已经完成.我非常不同意使用`setBackButtonTitlePositionAdjustment:forBarMetrics设置位置的解决方案:`如果用户从辅助功能设置启用了按钮形状,则形状将显示为丑陋的导航栏. (3认同)

Mah*_*abu 61

工作就像Swift 3上的魅力一样

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

  • 这将删除上一个视图的标题 (5认同)
  • 唯一适合我的解决方案。谢谢 ! (3认同)
  • 为我工作的还有Swift 4 (3认同)

Kar*_*kck 48

我在AppDelegate文件中使用这行代码didFinishLaunchingWithOptions来删除后退按钮title.

Swift 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
Run Code Online (Sandbox Code Playgroud)

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Run Code Online (Sandbox Code Playgroud)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
Run Code Online (Sandbox Code Playgroud)

  • `setBackButtonTitlePositionAdjustment`并不总是有效,当后退按钮标题很长,但不足以改为"后退"时,中间的标题将向右移动. (15认同)
  • 在iOS 11中,它打破了后退按钮的位置.它低于原来的位置 (2认同)

Pra*_*ble 18

只需要从其他ViewControllers所依赖的父ViewController中进行操作.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
Run Code Online (Sandbox Code Playgroud)


Viv*_*vek 9

只需将代码复制到 didFinishLaunchingWithOptions launchOptions

迅捷5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
Run Code Online (Sandbox Code Playgroud)


osc*_*lon 8

很简单.在后退按钮的标题中添加一个空格并准备好.请记住,它必须位于您要删除文本的上一个视图中.

在此输入图像描述


Ani*_*mar 7

您可以使用xcode 8和swift 3.0

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

  • 这不会从前一个视图控制器中删除标题吗? (3认同)

Gio*_*gio 7

在 iOS 14 上,现在backButtonDisplayModeUINavigationItem类中呈现该属性。因此,要删除后退按钮标题,您可以使用

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

viewDidLoad要删除它的 viewController的func 中。

要在所有导航栏中删除它,我使用了 swizzling 技术

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}
Run Code Online (Sandbox Code Playgroud)

并在application(_:didFinishLaunchingWithOptions:)通话中

UIViewController.swizzle()
Run Code Online (Sandbox Code Playgroud)


Sof*_*ner 7

iOS13的方法。

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

let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance

UINavigationBar.appearance().standardAppearance = navigationBarAppearance
Run Code Online (Sandbox Code Playgroud)


Kir*_*hav 6

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Run Code Online (Sandbox Code Playgroud)

在swift 3.0中使用了这行代码


Con*_*nor 5

您可以为UIViewController您想要此行为的所有s 创建子类,并在子类中创建viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(
        title: "", style: .plain, target: nil, action: nil)
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以选择您希望行为的控制器,而无需重复代码.我更喜欢我的控制器只是说"后退",而不是前一个控制器的标题,所以我在这里设置了这个标题.


Har*_*oom 5

从获得灵感rordulu的答案在这里,我最终创建一个自定义的UINavigationController和UINavigation酒吧,似乎处理这个棘手的问题的所有情况.

1)UINavigationController使用您的自定义初始化UINavigationBar:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

2)backItem.title每次视图自行设置时,将导航栏的属性设置为空字符串

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在每次使用此导航控制器和条形组合时,它都不会有后退按钮文本!

注意:如果还使用故事板,这应该可以正常工作,只需确保将自定义导航栏组件放入视图中

  • 刚刚意识到这有副作用,因为它会完全擦除导航项目标题.因此,当前一个视图显示时,它将没有标题!我会继续寻找这个烦人问题的完美解决方案. (3认同)