【问题标题】:How to change the UINavigationController back button name?如何更改 UINavigationController 后退按钮名称?
【发布时间】:2012-04-09 22:10:56
【问题描述】:

我有一个UIViewController,我正在从我的第一个视图控制器导航到第二个视图控制器,我想更改navigationcontroller 上显示的按钮的名称以返回......

SecondViewController *secondController = [[SecondViewController alloc]
                                              initWithNibName:nil
                                              bundle:NULL]; 
[self.navigationController pushViewController:secondController  animated:YES];

现在在第二个viewcontroller 我想更改navigationController 中按钮的名称。

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller uinavigationitem


    【解决方案1】:

    如果您希望以编程方式执行此操作,可以这样完成:

    目标-C

    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"Custom"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:nil
                                                                action:nil];
    
    [self.navigationItem setBackBarButtonItem:backItem];
    

    斯威夫特

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

    但是,如果您更喜欢使用 Interface Builder,只需选择您希望为其设置后退按钮的 UINavigationItem,然后导航到属性检查器以更改后退按钮的标题。

    注意:重要的是要记住,您必须在点击后退按钮时返回的视图控制器上配置此项,而不是当前可见的视图控制器。

    【讨论】:

    • @Shady 它还在。只需选择您的 UINavigationItem,您就会在 Interface Builder 的“属性检查器”选项卡中看到它。
    • 谢谢。尤其是最后的注释。
    • 注释很重要,字号要大一些,在答案的开头
    • 由于 iOS8 UIBarButtonItemStyleBordered 已被弃用,现在应该使用 UIBarButtonItemStylePlain
    • 备注很重要!
    【解决方案2】:

    在 viewWillAppear 中写这个

    self.navigationItem.title = @"List View";
    

    在 ViewWilldisapper 中写下这个

    self.navigationItem.title = @"Back";
    

    它可以在没有故事板的情况下工作。

    【讨论】:

    • 这样做你会看到标题在新视图之前实际发生变化(尤其是如果你有动画)。如果您使用 viewDidDisappear 进行操作,那么您将看到按钮实际发生了变化。 NSPostWhenIdle 的解决方案更好。原文出自:blog.evandavey.com/2008/12/…
    • 这不应该是公认的答案。 0x7fffffff 的答案是支持的方法。
    • 这不再起作用了。它也很hacky。 user716216 [stackoverflow.com/a/9871741/1195661]的答案应该是正确的。
    • 我已经尝试了所有解决方案,但唯一一个在任何地方都能完美运行的解决方案是在设计器中或通过代码向导航栏添加一个条形按钮并手动设置自定义选择器相信我这只是三四行任务但省去了很多挫折
    • 这不是一个很好的答案,因为它有效地解决了 - 而不是 - 为视图控制器栏按钮提供的 UIKit 工具。请参阅下面@0x7ffffffff 的答案
    【解决方案3】:

    在 Interface Builder 或 Storyboard 中有一种简单的方法可以做到这一点。在父视图控制器中,只需将导航项的属性“后退按钮”设置为您想要的任何标题。这是一个例子:

    Villian 的酒馆视图将“返回”作为返回按钮标题,就像我们刚刚在父导航控制器的属性检查器中设置的一样(最佳栏)。

    【讨论】:

    • 如果没有导航项,您可能需要在情节提要上的视图控制器中添加导航项。为此,请从对象库中选择 UINavigationItem 并将其拖到故事板上的视图控制器上。
    【解决方案4】:

    在视图控制器中“模拟指标”选项未选择为“推断”非常重要。

    我尝试了“无”,一切正常!

    【讨论】:

      【解决方案5】:

      如果您使用 Storyboard,有一种简单的方法可以做到这一点(对我来说效果很好)。

      • 转到您的故事板
      • 选择要更改后退按钮文本的 UIViewController。
      • 单击 UIViewController 顶部的 UINavigationItem。 (带标题的那个)
      • 在右侧面板上,选择属性检查器(第 4 个图标)。
      • 现在您可以设置标题、提示和返回按钮文本。

      来源:http://pinkstone.co.uk/how-to-change-the-back-button-text-on-a-uinavigationcontroller-in-your-storyboard/

      【讨论】:

        【解决方案6】:

        试试这样:-

        NSArray *viewControllerArr = [self.navigationController viewControllers];
        // get index of the previous ViewContoller
        long previousViewControllerIndex = [viewControllerArr indexOfObject:self] - 1;
        UIViewController *previous;
        if (previousViewControllerIndex >= 0) {
            previous = [viewControllerArr objectAtIndex:previousViewControllerIndex];
            previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                                         initWithTitle:@"Back"
                                                         style:UIBarButtonItemStylePlain
                                                         target:self
                                                         action:nil];
        }
        

        【讨论】:

          【解决方案7】:

          Swift 中我发现解决方案非常简单,

          假设我在 ViewControllerA 上并转到 ViewControllerB,如果我想更改 ViewControllerB 上显示的后退按钮的名称,我会在 ViewControllerA 中执行此操作,

          self.title = "BackButtonTitle"
          

          就是这样。

          注意:-这会改变ViewControllerA

          的标题

          【讨论】:

          • 这会改变 ViewControllerA 的标题,而不是改变 VCB 上的后退按钮。
          【解决方案8】:

          就我而言,它只能在主线程上运行代码,如下所示:

          dispatch_async(dispatch_get_main_queue(), ^(void) {
          
              self.navigationController.navigationBar.backItem.title = @"Custom Title";
          });
          

          【讨论】:

          • 这将更改为层次结构中的所有视图控制器,因此如果您按下返回按钮,那么之前的视图控制器标题也会受到影响。所以,这个案子需要处理。
          • 感谢您的评论。
          【解决方案9】:

          其实你可以改变后退按钮的标题:

          self.navigationItem.backBarButtonItem.title = @"NewName";
          

          【讨论】:

            【解决方案10】:

            如果您使用 Storyboard 引用,视图控制器可能不会在 Interface Builder 上显示导航项。

            手动拖拽导航栏不行,需要拖拽一个导航项

            然后您就可以设置其后退按钮的标题。这也是您设置视图标题的地方。

            引用米克·麦卡勒姆的话:

            注意:重要的是要记住,您必须在点击后退按钮时返回的视图控制器上配置此项,而不是当前可见的视图控制器。

            【讨论】:

              【解决方案11】:

              有两种方法可以做到这一点。

              第一种方式是通过程序代码:

              Yakimenko Aleksey 的回答是最简单的方法, 这确实有效(在 Xcode 8 + iOS 10 上测试)

              Swift3:

              self.navigationItem.backBarButtonItem?.title = "Your customized back title"
              

              注意:你应该在源视图控制器中调用上面的代码,而不是目标视图控制器。

              第二种方法是通过Main.strings文件使用storyboard本地化,

              "nnnnnnn.title" = "localized string";
              

              nnnnnn 表示 视图控制器(不是目标视图控制器!)中的 BackBarButtonItem 的对象 id!

              你需要设置导航栏项的“返回”属性,它会自动创建一个BarButtonItem,你找到它的对象ID。

              抱歉,我未能上传截图。

              【讨论】:

                【解决方案12】:

                您可以通过使用titleView of navigationItem 来实现此目的

                斯威夫特 3 答案

                • 为UINavigationItem 创建一个扩展名,如下所示

                extension UINavigationItem {
                    func customTitle(title: String) {
                        let titleLabel = UILabel()
                        titleLabel.text = title
                        titleLabel.textColor = UIColor.white
                        titleLabel.textAlignment = .center
                        titleLabel.sizeToFit()
                        titleView = titleLabel
                    }
                }
                

                • 在您的控制器viewDidLoad 中执行以下操作

                override func viewDidLoad() {
                        super.viewDidLoad()
                        // Do any additional setup after loading the view.
                        title = "Text For Back Button"
                        navigationItem.customTitle(title: "Title for your view controller")
                }
                

                【讨论】:

                  【解决方案13】:

                  斯威夫特 3:

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

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

                  【讨论】:

                    【解决方案14】:

                    试试下面的代码:

                    [self.navigationItem setValue:@[@"customTitle",@""] forKey:@"abbreviatedBackButtonTitles"];
                    

                    【讨论】:

                    【解决方案15】:

                    我有一个包含许多导航控制器的相当复杂的故事板,我的客户希望所有后退按钮都说“后退”

                    我在 Interface Builder 中浏览并将“Back”放入每个 UINavigationItem 的 Back button 字段中。

                    我并没有为每一个场景变化而努力!

                    问题在于 故事板中的每个视图控制器都有一个 UINavigationItem。

                    我通过将一个新的 UINavigationItem 拖到每个没有 UIViewController 的 UIViewController 上来解决此问题,并将后退按钮字段的所有设置为“后退”

                    注意那些没有自动获得自己的 UINavigationItem 的控制器。

                    【讨论】:

                      【解决方案16】:

                      斯威夫特 4

                      在你的 UIViewController 中,设置这个:

                      let backButton = UIBarButtonItem()
                      backButton.title = "[Your title here]"
                      self.navigationItem.backBarButtonItem = backButton
                      

                      【讨论】:

                        【解决方案17】:

                        我在 ViewController1 并转到 ViewController2,如果我想更改 ViewController2 上显示的后退按钮的名称,我将在 ViewController2 中执行此操作。

                        斯威夫特 5

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

                        Objective-C

                        self.navigationController.navigationBar.topItem.title = @"BackButtonTitle";
                        

                        【讨论】:

                          【解决方案18】:

                          在 Xcode 12 中 UINavigationItem 具有 backButtonTitle 属性

                          var backButtonTitle: String? { get set }
                          

                          【讨论】:

                            猜你喜欢
                            • 2011-05-04
                            • 1970-01-01
                            • 2015-10-11
                            • 1970-01-01
                            • 2012-04-19
                            • 1970-01-01
                            • 2012-12-27
                            • 2014-01-31
                            • 2011-01-15
                            相关资源
                            最近更新 更多