当前左边栏按钮的默认值是加载当前视图的视图的标题,换句话说,当按下按钮(后退按钮)时显示的视图。
我想把按钮上显示的文本更改为其他内容。
我试着把下面这行代码放在视图控制器的viewDidLoad方法中,但它似乎不起作用。
self.navigationItem.leftBarButtonItem.title = @"Log Out";
我该怎么办?
谢谢。
当前左边栏按钮的默认值是加载当前视图的视图的标题,换句话说,当按下按钮(后退按钮)时显示的视图。
我想把按钮上显示的文本更改为其他内容。
我试着把下面这行代码放在视图控制器的viewDidLoad方法中,但它似乎不起作用。
self.navigationItem.leftBarButtonItem.title = @"Log Out";
我该怎么办?
谢谢。
当前回答
根据UINavigationBar>backItem的文档
如果最上面导航项的leftBarButtonItem属性为 Nil,导航栏显示一个返回按钮,该按钮的标题是派生的 属性中的项。
但是设置backItem。backBarButtonItem在第一次viewWillAppear时不起作用。设置topItem。backBarButtonItem只适用于第一次viewWillAppear。因为navigationBar。topItem仍然指向previousViewController.navigationItem。在viewWillLayoutSubviews中,topItem和backItem被更新。在第一次viewWillAppear之后,我们应该设置backitem。backbarbuttonitem。
答:设置一个backBarButtonItem到前一个viewController的navigationItem,无论何时何地在你的当前viewController(顶部viewController)。你可以在viewWillAppear或viewDidLoad中使用这段代码。查看我的博客文章iOS设置导航栏返回按钮标题的详细分析。
NSArray *viewControllerArray = [self.navigationController viewControllers];
// get index of the previous ViewContoller
long previousIndex = [viewControllerArray indexOfObject:self] - 1;
if (previousIndex >= 0) {
UIViewController *previous = [viewControllerArray objectAtIndex:previousIndex];
previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:backButtonTitle
style:UIBarButtonItemStylePlain
target:self
action:nil];
}
其他回答
这是另一种方法。
在你的父视图控制器中,实现以下方法:
- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
self.navigationItem.backBarButtonItem.title = newTitle;
}
在你的子视图控制器中,当你想要改变标题时,这将会工作:
NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];
我从来没有能够让parentViewController属性工作:
[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];
我不知道这是一个错误还是我没有正确使用它。但是在viewControllers数组中抓取倒数第二个视图控制器指向父视图控制器,我可以用那个引用正确地调用父方法。
这里解释的解决方案没有一个对我有效。所以我所做的就是从我来自的场景中删除标题,方法如下:
自我。标题= @"";
因此,当新场景呈现时,后面的文本不会出现。
我完全同意,这不是一个明确的解决方案,但工作,没有一个解释对我有效。
我有一个父视图控制器,标题很长。这导致后退按钮的文本溢出到子视图控制器的标题中。
在尝试了一堆不同的解决方案后,这就是我最终所做的(扩展@john.k。doe方法):
使用Xcode 7.2, Swift 2
在故事板中,添加一个导航项到父视图控制器场景(不是子VC)
在新导航项的属性检查器上,在后退按钮字段中键入空格字符。稍后再详细介绍。
在父视图控制器中,添加以下代码:
代码片段:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case is ChildViewController:
navigationItem.backBarButtonItem?.title = ""
default:
navigationItem.backBarButtonItem?.title = "Full Parent Title"
}
}
解释:
后退按钮属于父视图控制器。Navigation Item为您提供了返回按钮的句柄,因此您可以在代码或故事板中设置标题。
注意:
如果你保留导航项返回按钮文本为默认空字符串,返回按钮标题将变成“返回”。
其他方法也管用,为什么要用这个呢?:
虽然在子视图控制器上重写back按钮标题是可能的,但在它已经在屏幕上短暂闪烁之前获得它的句柄是一个挑战。
有些方法构造一个新的后退按钮并覆盖现有的后退按钮。我确信它可以工作,并且在某些用例中可能是必要的。但我更喜欢在可能的情况下利用现有的api。
在某些情况下,改变父视图控制器的标题是最快的解决方案。但是,这会改变父标题,因此您必须管理状态。标签栏控制器也会变得混乱,因为标题更改会对标签栏项目标题产生副作用。
self.navigationController.navigationBar.backItem.title = @"TEXT";
在Swift中:
self.navigationController?.navigationBar.backItem?.title = "TEXT"
在Xcode 4.5中使用storyboard,到目前为止,当Back按钮的值不需要动态改变时,我发现最简单的解决方案是使用“Back button”字段与视图控制器的导航项相关联,你想让“Back”按钮表示其他内容。
例如,在下面的截图中,我想要视图控制器的后退按钮(s),我推有“后退”作为后退按钮的标题。
当然,如果你每次都需要返回按钮显示稍微不同的内容,这就行不通了……这里有所有其他的解决方案。