更改 UINavigationBar 后退按钮标题

Posted

技术标签:

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

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

我不想设置 leftbarbuttonitem。

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

谢谢,

【问题讨论】:

您现在可以在情节提要中设置它。 您是否意识到已接受的答案早已不再适用于现代 ios? rjobidon的作品 【参考方案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

以上是关于更改 UINavigationBar 后退按钮标题的主要内容,如果未能解决你的问题,请参考以下文章

如何从情节提要中更改 UINavigationBar 标题和后退按钮颜色?

iOS:删除 UINavigationBar 动画

引用 UINavigationBar 上的后退按钮

如何更改导航栏后退按钮的字体和颜色

UINavigationBar 中的多色后退按钮

如何向 UINavigationBar 添加后退按钮?