【问题标题】: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

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

【问题讨论】:

    标签: ios swift xcode


    【解决方案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)
                                }
                                

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2018-11-30
                                  • 2020-08-28
                                  • 1970-01-01
                                  • 2014-05-30
                                  • 2018-12-29
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多