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

时间:2015-04-28 07:03:12

标签: ios swift uibarbuttonitem

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

如果我在prepareForSegue函数中添加一些代码,那将会很麻烦。

有更好的方法来实现这个目标吗?

32 个答案:

答案 0 :(得分:108)

如果您想要后退箭头,请将代码放入AppDelegate文件中didFinishLaunchingWithOptions方法。

For Objective-C

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

For Swift

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

下面给出另一个选项。

Objective C

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

Swift

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

更新:

    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)

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

使用偏移

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

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

快乐的编码。

答案 1 :(得分:52)

工作就像Swift 3上的魅力

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

答案 2 :(得分:48)

我在add_image_size文件中将此行代码用于width="222" height="440"方法,以删除后退按钮AppDelegate

Swift 2.x

didFinishLaunchingWithOptions

Swift 3.x

title

Swift 4.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

答案 3 :(得分:11)

只需要从其他ViewControllers所依赖的 Parent ViewController 开始。

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

答案 4 :(得分:7)

您可以使用xcode 8和swift 3.0

self.navigationController?.navigationBar.backItem?.title = " "

答案 5 :(得分:6)

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

在swift 3.0中使用了这行代码

答案 6 :(得分:5)

你可以为你想要这种行为的所有UIViewController创建一个子类,并在子类的viewDidLoad中创建一个子类:

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

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

答案 7 :(得分:5)

rordulu's回答here获取灵感,我最终创建了一个自定义UINavigationController和UINavigation栏,似乎可以处理这个棘手问题的所有情况。

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

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

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

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

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

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

答案 8 :(得分:5)

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

enter image description here

答案 9 :(得分:3)

我通常在UIViewController的viewDidLoad中添加或更改后退按钮。

这样的事情应该有效:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

不要忘记更改并实现调用它来关闭视图的功能。

更简单,只需更改标题:

self.navigationItem.leftBarButtonItem.title = "Back"

答案 10 :(得分:2)

简单解决方案:

从第一个控制器中推第二个控制器时,请将 self.navigationItem.title =“” 放入第一个控制器的 viewWillDisappear 中。隐藏第二个控制器的后退按钮标题。

上面的语句隐藏了第一个控制器的标题,因此当我们回来时,我们再次想要第一个控制器的标题。为此,我们在第一个控制器的 viewWillAppear 方法中为第一个控制器添加了标题

请参阅(第一个控制器的)以下方法

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

答案 11 :(得分:2)

现在,在iOS 14上,backButtonDisplayMode类具有UINavigationItem属性。因此,要删除后退按钮标题,您可以使用

navigationItem.backButtonDisplayMode = .minimal

在要删除它的viewController的viewDidLoad函数中。

要在所有NavigationBar中将其删除,我使用了模糊处理技术

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

application(_:didFinishLaunchingWithOptions:)通话中

UIViewController.swizzle()

答案 12 :(得分:2)

更新的Swift 4.2答案

使用UIAppearance是解决问题的一种更干净的方法,但是它将导致所有UIBarButtonItem的文本清晰。该解决方案的改进版本可以是检查UIBarButtonItem中是否包含UINavigationBar

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

答案 13 :(得分:2)

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

答案 14 :(得分:2)

斯威夫特3:

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

答案 15 :(得分:1)

雨燕4

只需将此代码复制到didFinishLaunchingWithOptions launchOptions

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

答案 16 :(得分:1)

iOS13的一种方法。

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

let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance

UINavigationBar.appearance().standardAppearance = navigationBarAppearance

答案 17 :(得分:0)

class NavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        super.pushViewController(viewController, animated: animated)

        viewController.navigationItem.backButtonTitle = ""
    }
}

答案 18 :(得分:0)

您可以将此扩展名添加到UIViewController 然后在每个viewDidLoad()中调用此函数 喜欢:self.updateBackButton()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

答案 19 :(得分:0)

我找到了一个简单的解决方案:-

PersingtingViewController's viewWillDisappear方法jsut put

self.title = ""

并在title方法上为PersingtingViewController's设置viewWillAppear。 并对viewControllers中的所有navigationStack重复此操作,最后一个除外。

答案 20 :(得分:0)

viewDidLoad()

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

答案 21 :(得分:0)

对于那些不想使用方法混乱或在不同的视图控制器中复制相似代码的人,我有一个简单的解决方案。

要删除后退按钮标题,请创建UINavigationController子类并重写pushViewController(_,animation :)方法:

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

答案 22 :(得分:0)

Swift 5 上工作:

        self.navigationItem.backBarButtonItem?.title = ""

请注意,它将对下一个推送的视图控制器有效,而不是显示屏上当前的视图控制器,这就是为什么它非常令人困惑!

此外,检查情节提要,然后选择上一个视图控制器的导航项,然后在后退按钮(检查器)中键入一些内容。

答案 23 :(得分:0)

将以下代码放入任何UIViewcontroller extension中,它将隐藏所有UIViewcontroller的后退文本

open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

答案 24 :(得分:0)

只需使用覆盖函数UIViewController创建awakeFromNib()的扩展名,并为UIBarButtonItem添加一个空标题,然后赋予navigation backBarButtonItem

extension UIViewController {

  open override func awakeFromNib() {
    let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarBtnItem
  }

}

答案 25 :(得分:0)

快速4,5

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

答案 26 :(得分:0)

Swift 4.2和5

如果您稍后在代码中的任何时间使用图像选择器,则不必玩导航栏色彩,这会产生副作用。

使用以下代码:

extension UIViewController {
        open override func awakeFromNib() {
            navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}

从您的第一个ViewController调用它:

self.awakeFromNib()

答案 27 :(得分:0)

适用于 Swift 4.2

使用AppDelegate文件中的代码行到didFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)

答案 28 :(得分:0)

我想分享一个对我有用的解决方案。另外,可以根据您的需求和要求进行调整。

请注意,就我而言,我使用情节提要来指定CustomNavigationBar

Swift 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}

答案 29 :(得分:0)

我不知道为什么但是我发现在iPhone上隐藏按钮标题的问题但在没有加号的设备中显示正确

leftBarButtonItem.title = ""

所以我找到了简单的方法。在autolayout中设置要在NavigationViewController的NavigationBar中清除的色调颜色。如果您使用带有色调的图标或文本图块,则可能会出现问题。但在我的情况下,我并没有全部使用它。

答案 30 :(得分:0)

请使用:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

所以在viewDidLoad中调用此方法:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

答案 31 :(得分:-4)

我对setBackButtonTitlePositionAdjustment解决方案不满意,所以这里有一个快速的替代方法可以隐藏整个应用程序中的所有后退按钮文本:

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

您必须从AppDelegate func中的didFinishLaunchingWithOptions拨打这些内容。

外观也必须设置为.Highlighted状态,以避免在用户点按后退按钮时显示文字。