从保留图标的后退按钮中删除文本

Posted

技术标签:

【中文标题】从保留图标的后退按钮中删除文本【英文标题】:Remove text from Back button keeping the icon 【发布时间】:2015-10-08 20:20:24 【问题描述】:

我想从后退按钮中删除文本,但我想保留图标。我试过了

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

但是,这会完全删除文本和图标。

【问题讨论】:

【参考方案1】:

我知道这已经有了答案,但您也可以在代码中执行(以防您使用 nib)

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

在第一个视图控制器中添加上述内容。

请注意,您需要为每个正在推送的视图控制器执行此操作。因此,如果您有 3 个视图控制器,并且您想从所有视图控制器中删除后面的文本,则必须在视图控制器 1 和 2 中添加该行。

【讨论】:

这是迄今为止我见过的最好的解决方案,不会给我带来任何麻烦 .Plain 已更改为 .plain。没有大写p。 完美..!这就是我想要的。 最佳解决方案。谢谢。 @GastónAntonioMontes,它确实适用于 ios13,但它有点反直觉:空标题 backBarButtonItem 应该在 pushing 视图控制器上声明,而不是 pushed 一个【参考方案2】:

@rmd2 的方法几乎是正确的,但您应该选择后退按钮将指向的控制器的导航栏,然后在后退按钮字段中输入" "

【讨论】:

最糟糕的方式,如果视图控制器没有导航栏,我将不得不添加以删除文本【参考方案3】:

经过大量搜索,我找到了最佳和简单的解决方案,这将影响所有 用 Swift 4.2 编写并在 Swift 5 中工作的视图控制器

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

【讨论】:

像魅力一样工作 请注意,这仅在您的 ViewController 包含在 Storyboard 或 Nib 中时才有效... 一个天才的解决方案! 但要确保导航控制器的条形按钮项的色调颜色不是“清晰”。 这曾经对我有用,但不再适用(它仍然适用于 iOS 12 模拟器,只是不是最新的 iOS 13)...【参考方案4】:

后退按钮的文本取决于主视图的标题。

诀窍是如果主视图消失则清除标题,如果再次显示则重新设置:

override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "


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

【讨论】:

【参考方案5】:

如果您想从推送的视图控制器中删除后退按钮的标题...

假设一个名为 SettingsVC 的类将推送 SubSettingsVC 然后在 subSettingsVC 后退按钮中将显示标题<Settings 所以为了删除“设置”后退按钮的文本并使其类似于<

你必须在 SettingsVC 中设置 backBarButtonItem 标题 viewWillDisappear() 方法。

目标-C:

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

斯威夫特:

override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

【讨论】:

.Plain 已更改为 .plain。没有大写p。 搜索控制器行为需要更新答案。例如,如果您使用单独的 resultsVC 并点击推送另一个 VC 的项目,则不会调用初始 searchController 中的 viewWillDisappear 方法,因此标题仍然存在 如果您正在为整个应用程序中的屏幕寻找解决方案,这不是一个好方法。 - 如果您将此代码添加到某些“基本视图控制器”,第一个视图控制器的 viewWillDisappear 将在第二个视图控制器的 viewDidAppear 之后被调用(您通常在其中设置标题)......这会弄乱标题。最好的方法是覆盖后退按钮 完美解决方案谢谢【参考方案6】:

如果你想要返回箭头,那么将下面的代码放入 AppDelegate 文件到 didFinishLaunchingWithOptions 方法中。

对于斯威夫特

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

【讨论】:

我喜欢这个,因为您可以在一个文件中标准化您的应用程序的样式,并从应用程序委托中调用一次 这是一个非常好的和快速的解决方案,但是......如果你有除后面之外的其他栏按钮项目,这可能会很棘手:) 一个观察,如果你只实现“.normal”属性,你会看到点击文本。为“.selected”、“.highlighted”和“.disabled”添加相同的行。以确保您看不到闪烁的文字。 我认为这会产生副作用,除了后退按钮之外的其他栏按钮也会受到影响,并且会有清晰的文本颜色:(【参考方案7】:

就我而言,对于自定义图标和标题,这可以解决问题(Swift 4)

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

【讨论】:

该代码的最后一行对我来说完美无缺。所有其他建议都不起作用,可能是因为我的视图控制器都由导航控制器控制。在这种情况下,navigationController?确实需要。 如果要添加自定义后退按钮,则需要前四行。否则最后一行会成功。【参考方案8】:

这对我有用

override func viewDidLoad() 
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

【讨论】:

正确一个。在 ios 13 中,navigationItem.backBarButtonItem 不起作用。它节省了我数小时的努力。谢谢 这是唯一一个适用于 searchViewController 的情况【参考方案9】:

终于找到了完美的解决方案。

只需添加一张透明图片并在您的 AppDelegate 中添加以下代码。

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

【讨论】:

这绝对是最好的答案。我以前使用过大多数其他答案推荐的UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment hack,但它在 iPhone X 上被用于具有长标题的视图控制器。此解决方案完美无缺。 最佳答案。比透明文本颜色效果更好。 我在过去 4 年中使用的最佳解决方案!您只需在一个地方为所有视图控制器执行一次!!! 当我在 iOS 12 上尝试这个时,文本仍然出现在图像旁边。 :(【参考方案10】:

我通过在前一个 ViewController 的 StoryBoard Title 上添加一个“”解决了这个问题。只是一个空格,不是空的;D

【讨论】:

我需要前一个屏幕有一个标题,所以我想这对我不起作用。 我已将该标题设为空白,但标题仍在返回按钮标题中 不要空白标题,字段,在返回按钮字段中放置“”(空格)【参考方案11】:

在 Swift 4 中

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

【讨论】:

谢谢,它帮助了我,(Swift 4.0,Xcode 10.1,iOS 12.1.1),谢谢 但是,您将在父 vc 中失去您的头衔 如果存在大标题,则 topItem 为大标题。不工作【参考方案12】:

对于 Swift 4+,将这些行放入 AppDelegate didFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

【讨论】:

当您在应用程序委托中设置外观时,每个 UIBarButtonItem 都具有清晰的前景色,不是吗?因此,如果我添加一个带有文本的 UIBarButtonItem,我是否必须手动更改此按钮的前景色? 这很好,但是当你按下后退按钮时它仍然显示文本 它可以工作,但在 iOS 11 中使其他栏按钮消失。上面 Rafiqul Hasan 的回答可以解决问题【参考方案13】:

如果你有一个 ViewControllerA 并且你想导航到 ViewControllerB,在 ViewControllerA 中,你应该将当前的 navigationItem 设置为一个新的 UIBarButtonItem 并将标题设置为一个带有空格的字符串,然后再推送到另一个视图控制器:

设置标题为带空格的字符串,不能设置nil或""(空字符串),因为默认值为nil

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

【讨论】:

我得到了一些非常有趣的行为,即使在 ViewControllerB 中将标题设置为“”(并进行了检查)时,“返回”文本也会重新出现(尽管这一直有效,直到现在,在我的特殊情况下),这是唯一对我有用的解决方案【参考方案14】:

将此代码放入每个 VC 中,该 VC 会推送另一个

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

【讨论】:

【参考方案15】:

您可以使用UINavigationController 的委托方法从后退按钮中删除文本。

class CustomNavigationController: UINavigationController 

    override func viewDidLoad() 
        super.viewDidLoad()
        self.delegate = self
    



extension CustomNavigationController: UINavigationControllerDelegate 
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) 
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    
    

【讨论】:

【参考方案16】:
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) 

    // Your code

【讨论】:

【参考方案17】:

从导航控制器堆栈中的所有视图控制器中删除:

子类 UINavigationController 并添加:

override func show(_ vc: UIViewController, sender: Any?) 
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)


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


func setEmptyBackButton(_ viewController: UIViewController) 
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

【讨论】:

【参考方案18】:

Xcode 10、Swift 4+

此处与其他人的回答类似,但值得注意的是,如果文本仍未清除,则必须单击 Space 然后 Enter。

【讨论】:

【参考方案19】:

有时仅更改标题颜色是行不通的,以防标题很长。因为它可能会将导航栏标题向左移动。因此,为了防止它,您可能需要水平移动栏按钮标题以使其透明:

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

【讨论】:

【参考方案20】:

这将解决您的问题:

    import UIKit

    extension UINavigationController

    func customizeBackArrow()
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    

【讨论】:

这个没问题?!这也是正确的做法!谢谢【参考方案21】:

详情

Xcode 版本 10.2.1 (10E1001),Swift 5

解决方案

1.创建 UINavigationController 的自定义类

import UIKit

class NavigationController: UINavigationController 
    override func viewDidLoad() 
        super.viewDidLoad()
        delegate = self
    


extension NavigationController: UINavigationControllerDelegate 
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) 
        if viewController.navigationItemBackButtonTextIsHidden 
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        
    

2。添加 UIViewController 扩展

import UIKit

extension UIViewController 
    @objc var navigationItemBackButtonTextIsHidden: Bool  return false 

3.更新您的 ViewController 类

import UIKit

class ViewController: UIViewController 
    override var navigationItemBackButtonTextIsHidden: Bool  return true 

完整样本

import UIKit

// MARK: - ViewController

class ViewController: UIViewController 

    var screenCounter = 1

    override func viewDidLoad() 
        super.viewDidLoad()
        setupNavigationItem()
    

    override var navigationItemBackButtonTextIsHidden: Bool  return (screenCounter % 2) == 0 


extension ViewController 

    private func setupNavigationItem() 
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) 
        guard let navigationController = navigationController else  return 
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    


// MARK: - NavigationController

class NavigationController: UINavigationController 
    override func viewDidLoad() 
        super.viewDidLoad()
        delegate = self
    


extension NavigationController: UINavigationControllerDelegate 
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) 
        if viewController.navigationItemBackButtonTextIsHidden 
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        
    


// MARK: - UIViewController extension

extension UIViewController 
    @objc var navigationItemBackButtonTextIsHidden: Bool  return false 

结果

【讨论】:

【参考方案22】:

对我来说,这成功了:

override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(true)
    self.navigationItem.title = " "


override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)

请注意,如果您只设置标题而不修改 backBarButtonItem,它将出现 工作。但是,如果您尝试使用手势返回而不是 取消 并停留在推送的视图控制器上,则返回的标题将返回。

使用 Swift 4

【讨论】:

你能解释一下吗? 我有一个控制器,它总是显示带有返回按钮的返回文本。所以上面的代码在我的情况下不起作用【参考方案23】:

您应该选择控制器的导航栏,从哪个返回按钮将指向并在返回按钮字段中键入“”。

例如,如果您将 A 控制器推送到 B 控制器,请将空格放在 A 控制器导航栏中。

【讨论】:

【参考方案24】:

我尝试了几个答案,但无法让它们在所有情况下都有效。因此,如果设置了导航栏的标题,这是一种不影响导航栏标题的解决方法。

    guard let items = viewController.navigationController?.navigationBar.items else  return 
    for item in items 
        if item.title == nil 
            item.title = ""
        
    

【讨论】:

【参考方案25】:

对我来说,覆盖所有ViewControllers 的另一种方法是扩展UINavigationController 并设置topViewControllerbackBarButtonItem

Swift 5 在 Xcode 11.2.1 上:

extension UINavigationController 
    override open func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)

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

【讨论】:

【参考方案26】:

没有不必要的副作用的简单编程方式是在 source 的 awakeFromNib 方法中使用空项目初始化 navigationItem.backBarButtonItem strong> 控制器(您从中导航的那个):

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

注意:如果您稍后初始化后退按钮,例如在 viewDidLoad() 方法中,那么您将失去滑动返回功能(从左边缘滑动到右侧会带您在导航堆栈中后退一步)。

然后,如果你想为不同的目标控制器提供不同的后退按钮文本,并且如果你正在使用 segues,你可以在 prepare(for segue:, sender:) 方法中设置标题,比如这个:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let item = navigationItem.backBarButtonItem 
        switch segue.identifier 
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        
    

【讨论】:

这是最好的方法。也适用于 iOS 14。【参考方案27】:

以编程方式执行此操作的最简单方法是从父视图控制器(调用推送的控制器)设置backBarButtonItem

class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()

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

更多细节在这里https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/

【讨论】:

【参考方案28】:

Swift 5 版本删除后退按钮标题并设置自定义图像 ios 13.0+

 let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
        backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
        let navigationBarAppearance = UINavigationBarAppearance()
        navigationBarAppearance.backButtonAppearance = backButtonAppearance
        navigationBarAppearance.setBackIndicatorImage(#imageLiteral(resourceName: "back"), transitionMaskImage: #imageLiteral(resourceName: "back"))
        UINavigationBar.appearance().standardAppearance = navigationBarAppearance

在 App delegate didFinishLaucnh 中添加此代码

【讨论】:

【参考方案29】:

在带有 Swift 的 Xcode 9.2 中,它是这样工作的:

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

【讨论】:

【参考方案30】:

对于我们完全无法控制之前的视图控制器的情况(即如果我们在框架中工作),我们可以删除后退按钮的标题,如下所示:

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

它的作用是导航到导航堆栈的最后一项并删除其后面的标题。确保在我们的视图控制器出现时保存原始的:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...

然后重新分配它,以免破坏应用程序的任何部分:

override func viewWillDisappear(_ animated: Bool) 
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)

【讨论】:

以上是关于从保留图标的后退按钮中删除文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从iOS中保留后退图标的LeftNavigation Bar按钮中删除后退文本[重复]

Xamarin.Forms Android 保留汉堡包/菜单图标而不是后退按钮

隐藏导航栏但保留后退按钮 - SwiftUI

导航栏中的 Swift 自定义后退按钮

在 Summernote 中的后退按钮上取回文本

当我单击浏览器后退按钮或移动设备后退按钮时,保留选定的选项卡