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


81

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

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

还有更好的方法吗?


您还可以更改后退按钮的标题。要返回,您需要返回按钮。因此,我认为无需删除后退按钮。
Ashok Londhe,2015年

解决问题后请告知。
Ashok Londhe,2015年


有关于这个问题的好文章sarunw.com/posts/...
user3672430

Answers:


128

如果你想后退箭头使下面的代码投产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)

更新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)

因此可能是您的问题已解决。

快乐的编码。


8
setBackButtonTitlePositionAdjustment并非总是有效,当后退按钮标题很长,但又不足以更改为“返回”时,中间的标题将向右移动。
zgjie

3
@zgjie只是偏移量的一个主题。您可以轻松地将'-60'替换为'-6000',而
无需

9
此处的准确性稍高,标题属于PREVIOUS视图控制器。因此,请记住在presentViewController或pushViewController方法之前在此处进行设置。
本杰明

1
嗯,这在AppDelegate中不起作用。“类型AppDelegate的值没有成员navigationItem”
Prabhu

3
@DominikBucher我为此行为创建了一个类别,该类别在应用程序的每个位置都隐藏了按钮标题,这是一种“非怪诞”的方式,只需在您的项目中添加类别即可。我强烈不同意使用位置设置的解决方案,setBackButtonTitlePositionAdjustment:forBarMetrics:如果用户已从辅助功能设置中启用了按钮形状,则形状将显示出来,最终导致丑陋的导航栏。
Pratik Jamariya

71

Swift 3上的工作就像魅力

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

1
这是使用时唯一有效的工具navigationController?.pushViewController(_, animated:)
D. Greg

谢了哥们。这是唯一解决的方法。干杯。
费利佩

3
也为我工作过Swift 4
christijk

1
@MaksimKniazev,这个问题有解决办法吗?我在中找到了再次更新标题的唯一解决方案viewWillAppear:
Hemang

4
这会删除上一个视图的标题
Naser Mohamed

50

我正在使用成行的方法将AppDelegate文件中的这一行代码didFinishLaunchingWithOptions删除backbutton title

斯威夫特2.x

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

斯威夫特3.x

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

斯威夫特4.x

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

17
setBackButtonTitlePositionAdjustment并非总是有效,当后退按钮标题很长,但又不足以更改为“返回”时,中间的标题将向右移动。
zgjie

这不是理想的解决方案。如果我们在不更改左侧导航栏项目标题的情况下设置了任何导航标题,则该标题将向右移动,因为左侧的导航栏标题已插入。
mathema

2
在iOS 11中,它打破了后退按钮的位置。它低于其原始位置
korgx9 '18

那应该如何工作?文本仍可通过VoiceOver访问。
Lukasz Ciastko '18

取消或呈现imagepicker或某事完成后barbuttonitem不可见时,这产生的问题
纳普尔·沙玛

16

只需从其他ViewController所依赖的地方转到您的Parent ViewController

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

15

只需将代码复制到 didFinishLaunchingWithOptions launchOptions

迅捷5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

斯威夫特4

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

11

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

在此处输入图片说明


最佳解决方案IMO。不需要将整个应用设置为特定的清晰样式,这可能会使任何文字barbuttonitems消失。如果提到如果没有导航项,则必须将navigationItem拖到控制器,则可能会更好。
TheJeff

7

您可以使用xcode 8和swift 3.0

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

3
这不会完全从以前的视图控制器中删除标题吗?
NRitH

1
是的,它会删除标题为所有ViewController从推小号self.navigationController
耶夫亨杜比宁

7

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

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

这样,您可以选择要针对其执行操作的控制器,而无需复制代码。我希望我的控制器仅说“ Back”,而不是前一个控制器的标题,因此我在此处设置该标题。


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

在swift 3.0中使用了这一行代码


1
将影响UISearchController的“取消”按钮
JAHelia

5

以从中得到启发rordulu的答案在这里,我最终创建一个自定义的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()
    }
}

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

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


非常感谢!这是最好的方法,应该是正确的答案:)
GameDev

3
刚刚意识到这有一个副作用,因为它将完全擦除导航项标题。因此,当上一个视图显示时,它将没有标题!我将继续寻找这个烦人的问题的完美解决方案。
哈里·布鲁姆

该死的,你是对的。我怎么会想念它!如果您已解决此问题,请告诉我。感谢
GameDev

您能找到完美的解决方案@HarryBloom吗?
Hemang '18

@Hemang不是一个完美的解决方案,但是我发现了一些可行的方法。在此处添加了第二个答案stackoverflow.com/a/49094282/1532838
哈里·布鲁姆

3

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

这样的事情应该起作用:

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

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

甚至更容易,只需更改标题:

self.navigationItem.leftBarButtonItem.title = "Back"

7
这打破了iOS的内置支持,即从左向右滑动以向后导航的功能,恕我直言,破坏此功能的应用程序确实令人讨厌。
NRitH


2

在这里添加第二个答案,因为我的第一个答案仅部分起作用。该方法不太优雅,因为它需要在应用程序的每个视图中调用一个方法,但是它的工作没有任何副作用。

因此,首先,创建一个具有函数的UIViewController扩展类,以删除后退按钮文本并添加自定义后退按钮:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

其次,我们可以简单地在viewDidLoad需要它的每个视图控制器中调用该函数。


2

简单的解决方案:

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

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

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

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

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


2

更新了Swift 4.2的答案

与之UIAppearance共事是解决问题的一种更干净的方法,但是它将导致所有UIBarButtonItem内容清晰明了。该解决方案的改进版本可能是检查中是否UIBarButtonItem包含UINavigationBar

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

1

适用于Swift 5

        self.navigationItem.backBarButtonItem?.title = ""

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

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


1

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

要删除后退按钮标题,请创建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
    }
}

0

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

leftBarButtonItem.title = ""

所以我找到了简单的方法。在自动布局中,将其颜色设置为在NavigationViewController的NavigationBar中清除。如果您使用带有色彩的图标或文本图块,则可能会出现问题。但就我而言,我不会全部使用它。


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

0

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

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

0

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

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

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

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)

这会隐藏后退栏按钮文本,但不幸的是,它不会使导航栏标题居中
Giorgio

0

迅捷4.2和5

如果您以后在代码中的任何时间使用图像选择器,则不必使用导航栏色调颜色,而该颜色会产生副作用。

使用以下代码:

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

从第一个ViewController调用它:

self.awakeFromNib()

0

迅速4,5

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

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
  }

}

0

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

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

0

viewDidLoad()

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

0

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

PersingtingViewController's viewWillDisappear方法jsut

self.title = ""

并设置titlePersingtingViewController'sonviewWillAppear方法。重复此为所有viewControllersnavigationStack,除了最后一个。


0

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

navigationItem.backButtonDisplayMode = .minimal

viewDidLoad要删除它的viewController的功能中。

要在所有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()
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.