【问题标题】:How to set back button text in Swift如何在 Swift 中设置返回按钮文本
【发布时间】:2015-04-12 19:35:44
【问题描述】:

如何删除后退按钮文本。

当前的后退按钮:

所需的后退按钮:

这些都不起作用:

self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    后退按钮属于上一个视图控制器,而不是当前显示在屏幕上的那个。
    要修改后退按钮,您应该推送之前更新它,在启动 segue 的视图控制器上:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let backItem = UIBarButtonItem()
        backItem.title = "Something Else"
        navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
    }
    

    斯威夫特 3、4 和 5:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let backItem = UIBarButtonItem()
        backItem.title = "Something Else"
        navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
    }
    

    // in your viewDidLoad or viewWillAppear
    navigationItem.backBarButtonItem = UIBarButtonItem(
        title: "Something Else", style: .plain, target: nil, action: nil)
    
    

    【讨论】:

    • 非常感谢,你不知道我为了那个小细节花了多少时间(之前的控制器)
    • 如果我能投票一百万次,我会的。无法告诉你我花了多长时间想知道它为什么不起作用(以前在目标控制器上)
    • “后退按钮属于上一个视图控制器”这是我找到的关于这个主题的最有价值的答案!谢谢!
    • 设置title会改变标题,而不仅仅是后退按钮。
    • 我添加了 self.navigationController!.navigationBar.topItem!.backBarButtonItem = backItem 而不是 navigationItem.backBarButtonItem = backItem,它在 Swift 3 上运行良好。谢谢
    【解决方案2】:

    您可以从界面生成器中进行如下操作:

    点击前一个视图控制器的导航项

    从属性检查器中将后退按钮文本设置为您想要的任何内容。 就是这样!!

    【讨论】:

    • 分配“nil”的最佳方法是什么?
    • @kennydust 你的意思是空白标题吗?
    • @kennydust yes 在后退按钮添加空间并按回车
    • 很好很简单,但它可以本地化吗?
    • @AjinkyaPatil 我试过这个,但后退按钮没有出现。这可能是什么原因?
    【解决方案3】:

    你可以把这3行代码放在ViewController你想改变后退按钮标题。

    在你的override func viewDidLoad() {}

    let backButton = UIBarButtonItem()
    backButton.title = "My Back Button Title"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
    

    【讨论】:

    • 这个解决方案似乎更正确,因为您将逻辑放在到达的 VC 中,而不是您要离开的 VC 中。又名:读起来更好。
    • 可行的解决方案,但有一个很大的警告:记住后退按钮仍然属于 previous 视图控制器。例如,如果您的导航是 A > B C,并且您将此代码放在 B 中,则 C 中的后退按钮也会显示“我的后退按钮标题”
    【解决方案4】:

    后退按钮文本取自父视图控制器的导航项标题。因此,无论您在前一个视图控制器的导航项标题上设置什么,都将显示在当前视图控制器的后退按钮文本上。 您可以将“”作为导航项标题放在父视图控制器的 viewWillAppear 方法中。

    self.navigationItem.title = ""
    

    另一种方式是放

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

    在当前视图控制器的 viewWillAppear 方法中。如果导航堆栈过于嵌套,这将导致其他一些问题。

    【讨论】:

    • self.navigationItem.title = "" 应该是最佳答案!
    • 我同意这是最佳答案,因为以上所有答案都需要向导航项添加目标函数,因此它们不仅更改文本,而且还添加了自定义弹出函数,这问题不需要!
    • 这在prepareForSegue 中运行良好,即。更干净一点,因为您不会在加载后更改新的 viewController。
    • 注意!!!将 self.title = "....." 放在调用 self.navigationItem.title = "" 之前
    【解决方案5】:

    如果您使用 xib 文件作为视图控制器,请在视图控制器类中执行此操作。

    class AboutUsViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        edgesForExtendedLayout = []
        setUpNavBar()
    }
    
    func setUpNavBar(){
        //For title in navigation bar
        self.navigationController?.view.backgroundColor = UIColor.white
        self.navigationController?.view.tintColor = UIColor.orange
        self.navigationItem.title = "About Us"
    
        //For back button in navigation bar
        let backButton = UIBarButtonItem()
        backButton.title = "Back"
        self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
    }
    
    }
    

    结果将是:

    【讨论】:

      【解决方案6】:

      我不知道您在哪里使用了您提出问题的方法,但如果我在ViewController 类(我想在其中更改后退按钮)上使用@,我可以获得所需的结果987654326@函数,下面一行:

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

      结果将是:

      之前

      之后

      【讨论】:

      • 在我的情况下,只有将这段代码放在 viewDidAppear 方法而不是 viewDidLoad 方法上才有效
      • 使用navigationController.navigationBar.topItem?.title = "" 来避免将其放入viewDidAppear
      • 这似乎是最令人满意的方式,并且在调用控制器(较慢的设备)中使用 self.navigationItem.title = " " 将后退按钮标题更改为 " " 时避免了闪烁。还有另一种情况 self.navigationItem.title = " " 被完全忽略,间歇性地通过选项卡控制器选项卡开关以编程方式快速过渡到视图控制器。
      【解决方案7】:

      后退按钮属于前一个视图控制器,而不是当前显示在屏幕上的那个。 要修改后退按钮,您应该在推送之前对其进行更新,添加 viewdidload :

      斯威夫特 4:

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

      【讨论】:

        【解决方案8】:

        您可以只修改情节提要中的 NavigationItem

        在后退按钮中添加一个空格并按 Enter。

        注意:在之前的 VC 中执行此操作。

        【讨论】:

          【解决方案9】:

          这应该可行:

          override func viewDidLoad() {
              super.viewDidLoad()
          
              var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
              self.navigationItem.backBarButtonItem = button
          
          }
          
          func goBack()
          {
              self.navigationController?.popViewControllerAnimated(true)
          }
          

          虽然不推荐这样做,因为它实际上替换了 backButton,并且还移除了后退箭头和滑动手势。

          【讨论】:

          • 不是正确的做法,你只是在替换后退按钮
          • 最好从界面构建器中完成
          【解决方案10】:

          斯威夫特 4.2

          如果您想更改导航栏后退按钮项的文本,请将其放在控制器的viewDidLoad 中,在后退按钮显示之前,而不是在后退按钮可见的视图控制器上。

           let backButton = UIBarButtonItem()
           backButton.title = "New Back Button Text"
           self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
          

          如果您想更改当前导航栏标题文本,请使用以下代码(请注意,这将成为推送到导航控制器的 NEXT 视图的默认后退文本,但此默认后退文本可以被上面的代码覆盖)

           self.title = "Navigation Bar Title"
          

          【讨论】:

            【解决方案11】:

            Swift 4 - 在按下任何视图控制器之前配置后退按钮

            // if you want to remove the text
            navigationItem.backBarButtonItem = UIBarButtonItem()
            
            // if you want to modify the text to "back"
            navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
            

            【讨论】:

              【解决方案12】:

              有两种方法。

              1.在前面的ViewController.viewDidLoad()中

              let backBarBtnItem = UIBarButtonItem()
              backBarBtnItem.title = "back"
              navigationItem.backBarButtonItem = backBarBtnItem
              

              2.在currentViewController.viewDidAppear()中

              let backBarBtnItem = UIBarButtonItem()
              backBarBtnItem.title = "back"      
              navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem
              

              原因:backButton来自navigationBar.backItem.backBarButtonItem,所以第一种方式很明显。在currentViewController.viewDidLoad()中,我们无法获得backItem的引用,因为在viewDidAppear()中,@987654327 @将navigationView推到stack上。所以我们可以在currentViewController.viewDidAppear()中修改backItem

              更多详情可以看Document:UINavigationBar

              【讨论】:

                【解决方案13】:

                呈现控制器viewDidLoad方法中添加:

                // hide navigation bar title in the next controller
                let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = backButton
                

                【讨论】:

                  【解决方案14】:

                  虽然这些答案解决了问题,但这可能是一些有用的

                  class MainNavigatioController: UINavigationController {
                  
                      override func pushViewController(_ viewController: UIViewController, animated: Bool) {
                          // first
                          let backItem = UIBarButtonItem()
                          backItem.title = "رجوع"
                          self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
                          // then
                          super.pushViewController(viewController, animated: animated)
                  
                      }
                  
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    斯威夫特 4

                    虽然前面说的准备segue是正确的,并且返回按钮确实属于以前的VC,但它只是添加了一堆不必要的代码。

                    最好的办法是在 viewDidLoad 中设置当前 VC 的标题,它会自动在下一个 VC 上正确设置后退按钮标题。这条线对我有用

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

                    【讨论】:

                      【解决方案16】:

                      这适用于 Swift 5

                      self.navigationItem.backBarButtonItem?.title = ""
                      

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

                      另外,检查情节提要并选择 previous 视图控制器的导航项,然后在 Back Button (Inspector) 中输入一些内容。

                      【讨论】:

                      • 这并没有改变任何东西。这有效:navigationItem.backButtonTitle = ""
                      • 对下一个推送的视图控制器而不是当前显示的视图控制器有效
                      • 不行,我到处放,还是不行。它返回零,所以我什至没有。我认为这适用于您自定义并添加了自己的按钮。我正在操纵“真实”的那个。如果您更改 backButtonTitle 上的文本,它对您有什么帮助吗?我认为他们是两个不同的人。
                      【解决方案17】:

                      试试这个......它会工作......

                      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                          self.title = ""
                      }
                      

                      上面的代码将隐藏文本并在导航栏上只显示后退箭头。

                      【讨论】:

                        【解决方案18】:

                        斯威夫特 4

                        在我的情况下,解决方案是在移动到子视图控制器之前清除主视图控制器的导航项。如果再次显示则重新设置

                        主控制器

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

                        这就是我如何推送 UIViewController 并清除子控制器中的后退栏按钮项:

                        主控制器

                        let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
                        childController.navigationItem.backBarButtonItem?.title = ""
                        navigationController?.pushViewController(childController, animated: true)
                        

                        【讨论】:

                          【解决方案19】:

                          可以将以下代码添加到视图控制器,您可以从其中推送要更改返回按钮文本的视图控制器

                          斯威夫特 5

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

                          例如:-

                          1. ViewController1
                          2. ViewController2

                          假设我们要更新 viewcontroller2 的标题,并且我们正在从 viewcontroller1 推送 viewcontroller2。

                          那么您可以使用以下代码:-

                          let vc2 = storyboard.instantiateViewController(withIdentifier: "ViewController2")
                          self.navigationItem.backBarButtonItem = UIBarButtonItem(title:  "your custom back button title", style: .plain, target: self, action: nil)
                          self.navigationController?.pushViewController(vc2, animated: true)
                          

                          【讨论】:

                            【解决方案20】:

                            后退按钮文字和彩色文字:

                            navigationController?.navigationBar.tintColor = .red
                            navigationController?.navigationBar.topItem?.backButtonTitle = "Hi"
                            

                            【讨论】:

                              【解决方案21】:

                              设置self.title = ""self.navigationController?.pushViewController(vc, animated: true)之前。

                              【讨论】:

                              • 那么你失去了当前的VC头衔?
                              【解决方案22】:
                              override func viewWillAppear(_ animated: Bool) {
                              
                                  self.tabBarController?.navigationItem.title = "Notes"
                              
                                  let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))
                              
                                  self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
                              }
                              
                              func goToNoteEditorViewController(){
                                 // action what you want
                              }
                              

                              希望对你有帮助!! #斯威夫特 3

                              【讨论】:

                                【解决方案23】:

                                如果您从页面视图控制器页面推送视图控制器,则无法更新导航控制器的后退按钮标题。为了解决这个问题,创建一个委托给你的父视图控制器(你也可以遍历视图控制器层次结构回到父视图)。

                                此外,后退按钮有字符限制。如果超过该字符限制,系统将默认为“返回”。它不会为您截断。例如:

                                backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
                                backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
                                

                                【讨论】:

                                  【解决方案24】:

                                  适用于 Swift 4.2

                                  let backItem = UIBarButtonItem()
                                  backItem.title = ""
                                  navigationItem.backBarButtonItem = backItem
                                  

                                  【讨论】:

                                    【解决方案25】:

                                    GOTCHA:如果您对任何多星建议有疑问,请确保您在viewDidLoad() 中注册您的UITableViewCells,而不是来自init()

                                    【讨论】:

                                      【解决方案26】:

                                      它对我有用。斯威夫特 5

                                      navigationItem.backButtonTitle = ""
                                      

                                      【讨论】:

                                        【解决方案27】:

                                        Swift 5

                                        中检查并运行解决方案

                                        下面我针对不同情况提出几个解决方案:

                                        1。从后退按钮中删除文本

                                        从后退按钮中删除文本的最佳解决方案是在 viewDidLoad() 中添加:

                                        navigationItem.backBarButtonItem = UIBarButtonItem()
                                        

                                        2。在后退按钮上设置自己的文本

                                        如果您想设置自己的标题,请通过设置 backButton 的标题来实现:

                                        let backButton = UIBarButtonItem()
                                        backButton.title = "My Title"
                                        navigationItem.backBarButtonItem = backItem
                                        

                                        3。所有 VC 上的空返回按钮

                                        如果您想在整个应用程序中创建通用样式 - 只是没有文本的箭头,请为您的所有视图控制器创建基本 VC:

                                        class BaseViewController: UIViewController {
                                            override func viewDidLoad() {
                                                super.viewDidLoad()
                                        
                                                navigationItem.backBarButtonItem = UIBarButtonItem()
                                            }
                                        }
                                        

                                        上面提出的解决方案可以让你在以后自定义后退按钮,如果你想稍后做出一些例外,通过添加额外的变量并在特定的 ViewController 中覆盖它,f.ex:

                                        class BaseViewController: UIViewController {
                                        
                                            var customBackButtonTitle: String?
                                        
                                            override func viewDidLoad() {
                                                super.viewDidLoad()
                                        
                                                var backButton = UIBarButtonItem()
                                                if let text = customBackButtonTitle {
                                                    backButton.title = text
                                                }
                                                navigationItem.backBarButtonItem = backButton
                                            }
                                        }
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2016-10-29
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2019-10-17
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2017-09-11
                                          相关资源
                                          最近更新 更多