【问题标题】:Change UINavigationBar back button title更改 UINavigationBar 后退按钮标题
【发布时间】:2014-06-01 18:20:08
【问题描述】:

在我的应用程序中,我想使用“后退”文本作为每个视图控制器的后退按钮标题。 我在stackoverflow上阅读了很多帖子,但一无所获。

我不想设置 leftbarbuttonitem。

谁能帮我完成这个简单的任务。

谢谢,

【问题讨论】:

  • 您现在可以在情节提要中设置它。
  • 您是否意识到已接受的答案早已不再适用于现代 ios? rjobidon的作品

标签: ios uinavigationcontroller title back-button


【解决方案1】:

要删除所有视图控制器的后退按钮标题,请添加新的 swift 文件并将此灭绝复制到它

    import UIKit

    extension UIViewController {
        static func swizzle(){


            let orginalSelector = #selector(viewDidLoad)
            let swizzledSelector = #selector(swizzledViewDidLoad)

            let orginalMethod = class_getInstanceMethod(UIViewController.self, orginalSelector)
            let swizzledMethod = class_getInstanceMethod(UIViewController.self, #selector(swizzledViewDidLoad))

            let didAddMethod = class_addMethod(UIViewController.self, orginalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))

            if didAddMethod {
                class_replaceMethod(UIViewController.self, swizzledSelector, method_getImplementation(orginalMethod!), method_getTypeEncoding(orginalMethod!))
            }else{
                method_exchangeImplementations(orginalMethod!, swizzledMethod!)
            }

        }

        @objc func swizzledViewDidLoad(){
            navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
            swizzledViewDidLoad()
        }


    }

之后在AppDelegate里面的didFinishLaunchingWithOptions中,调用swizzle函数。

UIViewController.swizzle()

此函数使用目标 c 运行时将 viewDidLoad 方法与另一个删除后退按钮标题的方法交换,然后在其中调用原始 viewDidLoad

【讨论】:

    【解决方案2】:

    更改当前可见的后退按钮

    extension UIViewController {
    func setCurrentBackButton(title: String) {
        guard let vcCount = self.navigationController?.viewControllers.count else {
            return
        }
    
        let priorVCPosition = vcCount - 2
    
        guard priorVCPosition >= 0 else {
            return
        }
    
        self.navigationController?.viewControllers[priorVCPosition].navigationItem.backBarButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil)
    }
    

    【讨论】:

    • 谢谢这解决了很久的问题。只有一个有效。
    【解决方案3】:

    带返回箭头的返回按钮

    目标-C

    self.navigationController.navigationBar.topItem.backBarButtonItem = 
    [[UIBarButtonItem alloc] initWithTitle:@"Title" style:UIBarButtonItemStylePlain
    target:nil action:nil];
    

    斯威夫特

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

    没有返回箭头的普通按钮

    目标-C

    self.navigationItem.leftBarButtonItem = 
    [[UIBarButtonItem alloc] initWithTitle:@"Title" 
    style:UIBarButtonItemStylePlain target:nil action:nil];
    

    斯威夫特

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

    不带返回箭头的粗体按钮

    目标-C

    self.navigationItem.leftBarButtonItem = 
    [[UIBarButtonItem alloc] initWithTitle:@"Title" 
    style:UIBarButtonItemStyleDone target:nil action:nil];
    

    斯威夫特

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title:"Title", 
    style:.done, target:nil, action:nil)
    

    【讨论】:

      【解决方案4】:

      AppDelegate 中的DidFinishLaunchingWithOptions 中添加此代码:

      [[UIBarButtonItem appearance] 
      setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000.0, 0.0) 
      forBarMetrics:UIBarMetricsDefault];
      

      【讨论】:

        【解决方案5】:

        swift 2.0:

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            self.navigationController?.navigationBar.topItem?.title = ""
        }
        

        注意:仅当故事板具有导航堆栈链时才有效。

        其他选项/更改标题:

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

        删除导航项:

        navigationItem.setLeftBarButtonItem(nil, animated: true)
        

        【讨论】:

        • 虽然这段代码可以回答这个问题,但最好解释一下它的作用并添加一些参考。
        • 它改变了栏中间的标题而不是后退按钮的标题
        【解决方案6】:

        在父视图控制器中而不是在子视图控制器中执行此操作

        斯威夫特

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

        Objetive-C

        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
        

        【讨论】:

        • 经过测试,运行良好的 iOS 9.3.2
        • navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 在 Swift 中
        • 没什么变化,我试过viewDidLoadviewWillAppear
        • 必须在之前的视图控制器中添加上面的代码。
        【解决方案7】:

        如果您使用情节提要,您可以在父视图控制器中选择导航项,然后在“Back Button”字段中设置所需的按钮文本。请记住在 parent 视图控制器中进行设置,而不是在被推送的子视图控制器中设置。

        【讨论】:

        • 非常感谢!这对我很有帮助
        【解决方案8】:
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        

        【讨论】:

          【解决方案9】:

          我需要使用self.navigationController.navigationBar.backItem.title = @"";,不同之处在于我使用的是backItem而不是topItem

          【讨论】:

          • 它不起作用。你在哪里称呼它?我尝试了viewDidLoadviewWillAppear,但是当它调用self.navigationController?.navigationBar.backItem?.title = "test"时没有任何反应
          【解决方案10】:
          self.navigationController.navigationBar.topItem.title = @"";
          

          【讨论】:

          • 很棒的修复...谢谢
          • 在我的情况下 navigationController?.navigationBar.backItem?.title = "" 用于返回按钮
          • 这种方法的问题是,假设您有一个标题为“Home”的主视图控制器,然后当您申请时导航到标题为“Child”的第二个视图控制器这样,它会改变返回按钮的标题,但是当你返回时,它会改变主屏幕标题返回按钮的标题。 ;) 除非您没有再次明确设置它。
          • 这是一个更好的解决方案
          • 它改变了栏中间的标题而不是后退按钮的标题
          【解决方案11】:

          试试这个希望它会工作

          UIBarButtonItem *btn = 
                  [[UIBarButtonItem alloc] initWithTitle:@"New Title" 
                                                   style:UIBarButtonItemStyleBordered 
                                                  target:nil 
                                                  action:nil];
          [[self navigationItem] setBackBarButtonItem:btn];
          

          【讨论】:

          • 在视图中添加这一行确实加载方法从您切换下一个视图控制器的位置。就像您要从主视图控制器进入详细视图控制器(具有后退按钮)然后将其添加到主视图控制器 viewdidload 方法 @SeemaSharma
          猜你喜欢
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 2012-05-01
          • 2023-04-01
          相关资源
          最近更新 更多