如何更改子视图控制器中的后退按钮文本?

我知道您可以从IB或prepareForSegue设置后退按钮的标题,但在我的应用程序中,我需要根据控制器可见时可能发生的事件更新标题。

我试过但没有任何反应:

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

这虽然有效,但没有后退箭头:

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

有任何想法吗?

backBarButtonItem是用于导航堆栈中下一个控制器的后退按钮的项目。
因此,例如,如果您有一个带有根视图控制器A的导航控制器并且您推动了一个viewController B ,则使用A配置一旦推出B就看到的后退按钮标题。

你可以这样:

 A.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Go back to A", style: .Plain, target: nil, action: nil) 

按下B ,您会看到一个带有“返回A”的后退按钮。

在你的情况下,棘手的部分是在B的导航堆栈中找到A 您可以通过在navigationControllerviewControllers中搜索来执行此viewControllers ,如下所示:

 // This code works from the `B` view controller let viewControllers = self.navigationController?.viewControllers ?? [] if let indexOfCurrent = viewControllers.indexOf(self) where (indexOfCurrent > viewControllers.startIndex) { let indexOfPrevious = indexOfCurrent.advancedBy(-1) let previousViewController = viewControllers[indexOfPrevious] previousViewController.navigationItem.backBarButtonItem?.title = "New Title" } 

编辑

我不知道在那之后刷新导航栏的任何干净方法。 也许你可以就此问一个单独的问题。
你可以做的是弹出并推动视图控制器没有动画

 if let navigationController = self.navigationController { navigationController.popViewControllerAnimated(false) navigationController.pushViewController(self, animated: false) } 

或者也许尝试创建一个新的UIBarButtonItem而不是更改现有的UIBarButtonItem的标题。

尝试这个:

 let baritems = self.navigationController?.navigationBar.items for item in baritems!{ if (item.leftBarButtonItem != nil){ item.title = "123" } } 

这个问题现在已经很老了,但我在基于嵌套的tableViewController的选定单元格更改后退按钮文本时遇到了问题。

看起来,navigationViewController的默认后退按钮将其文本基于用户返回的视图控制器的标题。

你可能应该小心,因为我的解决方案做了一些假设我不是肯定的将永远是真的。

 let vcs = navigationController?.viewControllers vcs?[(vcs?.count)! - 2].navigationItem.title = "Your Text Here" 

假设我们当前的视图控制器位于导航堆栈的顶部 – > vcs [vcs.count – 1]; 在此堆栈之前存在一个视图控制器 – > vcs [vcs.count – 2]; 并且可以更改前一个视图控制器的navigationItem.title而不会产生不必要的副作用; 我们可以通过更改前一个视图控制器的导航标题来更改后退按钮文本。