Swift 更改后退按钮的文字

Swift change text of back button

我在更改导航栏中后退按钮的文本时遇到了一个小问题。我的应用程序如下所示:

-> Navigation Controller1 -> ViewController1 -> ViewController2 -显示详细信息> TabBarController -> NavigationController2 -> ViewController3 - > ViewController4

我通过添加

为我的 ViewController2 更改了后退按钮的文本
self.navigationItem.backBarButtonItem?.title = "Test"

ViewController1 进入 viewDidLoad() 方法。但是我无法从 ViewController4

更改后退按钮的文本

我做了一些研究并找到了一些解决方案,但它们对我不起作用。

我试过:

App Delegate - 我遇到了崩溃:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Please file a radar on UIKit if you see this assertion.

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Code       
 UIBarButtonItem.appearance().title = "Test"
//Code 
return true 
}

在推送中 ViewController3 - 没有任何变化

    self.navigationItem.backBarButtonItem?.title = "Test"

NavigationController2 - 什么都没有改变

    self.navigationItem.backBarButtonItem?.title = "Test"

NavigationController2 - 什么都没有改变

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

在我的 故事板 中更改 NavigationItem 中的文本 - 没有任何反应

最好的解决方案是将其设置在 App Delegate 中。但我不能,因为它正在崩溃......

你知道我做错了什么吗?

崩溃日志:

2015-11-12 15:51:56.444 Name[2988:417662] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x22718f8f 0x30dc9c8b 0x22632c2b 0x262e55e7 0x260358b1 0x25f03439 0x262e2c83 0x25e40baf 0x25e406bb 0x2603f153 0x2603f0cb 0x25d9fd27 0x2605b987 0x2603efb7 0x25d9779d 0x25d96dc7 0x25d96ce1 0x25da154b 0x25da0f6b 0x25e2cf1f 0x25e2c917 0x25e2c6dd 0x25e2c19f 0x25e44a75 0x25e446b5 0x25e44649 0x25d97e43 0x257abd29 0x257a755d 0x257a73e5 0x257a6d81 0x257a6b6f 0x257a0849 0x226dedcd 0x226dc48b 0x226dc893 0x22628f31 0x22628d43 0x2a103201 0x25dfa879 0x10b778 0x3137baaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

按照您概述转场的方式,ViewController3 似乎根本不应该有后退按钮。 Show Detail segue 替换 UISplitViewController 中的 child 视图控制器,或者以其他方式呈现 child。无处可去

在 ViewController3 的 viewDidLoad 中尝试这个(使用 pre-Swift 2 语法):

if let _ = self.navigationItem.backBarButtonItem {
    print("not nil")
} else {
    print("nil")
}

当我在示例项目上尝试时,结果为零。我认为这是核心问题。

这一点 hacker 有效:

if let navButtons = self.navigationController?.navigationBar.items {
    if navButtons.count > 0 {
        navButtons[0].title = "Test"
    }
}

然而,这太糟糕了。操纵演示文稿的标题 ViewController(根据 @vadian 的建议)显然更干净。

这就是我的做法

在文件顶部为您的栏按钮创建一个新变量:

var leftBarButton: UIBarButtonItem!

然后设置按钮的属性

self.leftBarButton = UIBarButtonItem(title: "Your title", style: .Plain, target: self, action: "leftButtonAction")

最后在导航控制器中设置新的栏按钮

self.navigationItem.leftBarButtonItem = leftBarButton

希望对您有所帮助!

由于目标控制器的后退栏按钮的标题自动显示源控制器的导航项的标题,一种方法是在源视图控制器中设置导航项的标题

  • viewWillAppear()viewDidAppear() 中到正常标题。
  • prepareForSegue() 标题中,后退栏按钮应该显示。

这个解决方案对我有用:(在你推送的 ViewController 的 viewDidLoadviewWillAppear 中使用这个)

let backButton = UIBarButtonItem()
    backButton.title = "Your text"
    backButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red], for: .normal)
    navigationController?.viewControllers[(navigationController?.viewControllers.count)! - 2].navigationItem.backBarButtonItem = backButton