目前左栏按钮的默认值是加载当前一个的视图的标题,换句话说是按下按钮时显示的视图(后退按钮)。
我想将按钮上显示的文字更改为其他内容。
我尝试在视图控制器的viewDidLoad方法中放入以下代码行,但它似乎不起作用。
self.navigationItem.leftBarButtonItem.title = @"Log Out";
我该怎么办?
感谢。
答案 0 :(得分:340)
这应放在调用标题为“NewTitle”的ViewController的方法中。 就在push或popViewController语句之前。
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"NewTitle"
style:UIBarButtonItemStyleBordered
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
答案 1 :(得分:94)
在ChildVC中,这对我有用......
self.navigationController.navigationBar.topItem.title = @"Back";
也适用于Swift!
self.navigationController!.navigationBar.topItem!.title = "Back"
答案 2 :(得分:80)
以下是 backBarButtonItem 的文档:
“此导航项目位于最顶层项目的正下方 堆栈,导航控制器派生后退按钮 此导航项的导航栏。 [...] 如果你想 为后退按钮指定自定义图像或标题,您可以指定一个 自定义栏按钮项(带有您的自定义标题或图像) 而不是财产。“
查看控制器 A (“父”视图控制器):
self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
当任何其他视图控制器 B 位于导航堆栈顶部,并且 A 位于其下方时, B 的后退按钮将标题“短”。
答案 3 :(得分:56)
在Xcode 4.5中使用storyboard,到目前为止,当Back按钮的值不必动态更改时,我发现最简单的解决方案是使用与View Controller的导航项关联的“Back Button”字段您希望“后退”按钮说出其他内容。
e.g。在下面的屏幕截图中,我想要视图控制器的后退按钮,我推动将“后退”作为后退按钮的标题。
当然,如果你每次都需要后退按钮说一些稍微不同的东西,这将无效。这里有其他所有解决方案。
答案 4 :(得分:41)
我知道,问题很严重,但我找到了一个很好的解决方案。
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
从childView开始工作!经过iOS 7测试。
答案 5 :(得分:26)
也许我过于简单化,但从Apple的文档中可以看出:
如果任一视图控制器未指定自定义栏按钮项,则使用默认后退按钮,并将其标题设置为标题的值上一个视图控制器的属性 - 即视图控制器在堆栈上向下一级。
上面标记正确的解决方案从父控制器设置默认按钮项。这是正确的答案,但我正在通过在将新控制器推送到NavigationController堆栈之前更改UIViewController的self.title
属性来解决问题。
这会自动更新下一个控制器上的后退按钮的标题,只要您将self.title
设置回viewWillAppear
中的内容,我就看不到这种方法造成太多问题。
答案 6 :(得分:19)
在Swift / iOS8中,以下内容对我有用:
let backButton = UIBarButtonItem(
title: "Back Button Text",
style: UIBarButtonItemStyle.Bordered,
target: nil,
action: nil
);
self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;
来自费利佩的回答。
答案 7 :(得分:18)
这项工作对我来说更好。试试:
self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
答案 8 :(得分:17)
好的,这就是方法。如果你有一个视图控制器“第一”,你通过按下按钮等导航另一个视图控制器“秒”,你需要做一些工作。 首先,您需要在“第二”视图控制器的ViewDidLoad方法中创建一个BarButtonItem,如下所示;
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
initWithTitle:@"Back"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(OnClick_btnBack:)];
self.navigationItem.leftBarButtonItem = btnBack;
[btnBack release];
执行此操作后,您需要在同一个.m文件中写入“btnBack”操作的代码;
-(IBAction)OnClick_btnBack:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
//[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}
就是这样。
答案 9 :(得分:15)
我有一个父视图控制器,标题很长。这导致后退按钮文本出现在子视图控制器的标题中。
在尝试了一堆不同的解决方案后,这就是我最终做的事情(扩展@ john.k.doe方法):
使用Xcode 7.2,Swift 2
Navigation Item
添加到父视图控制器场景(不是子VC)Attributes Inspector
的{{1}}上,在Navigation Item
字段中输入space
个字符。稍后会详细介绍。片段:
Back Button
<强>解释强>
后退按钮排序属于父视图控制器。 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
Navigation Item
文字保留为默认空字符串,则后退按钮标题将变为“返回”。
其他方法有效,为何使用此方法?:
虽然可以覆盖子视图控制器上的后退按钮标题,但是在它已经在屏幕上短暂闪烁之前获取它是一个挑战。
有些方法会构建一个新的后退按钮并覆盖现有的后退按钮。我确信它有效,在某些用例中可能是必要的。但我希望尽可能利用现有的API。
更改父视图控制器的Back Button
是某些情况下最快的解决方案。但是,这会更改父标题,因此您必须管理状态。使用title
时,事情也会变得混乱,因为标题更改会导致Tab Bar Controller
标题产生副作用。
答案 10 :(得分:10)
对于那些使用故事板的人,只需选择父级(不是持有目标视图的那个)视图控制器框架(确保在导航栏上单击右键,然后打开属性检查器,您将在其中找到三个表单输入。第三个“后退按钮”是我们正在寻找的。 p>
答案 11 :(得分:7)
Swift版本:
在您的孩子ViewController中:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
答案 12 :(得分:6)
这是另一种方法。
在父视图控制器中,实现以下方法:
- (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
数组中倒数第二个视图控制器指向父视图控制器,我可以使用该引用正确调用父方法。
答案 13 :(得分:5)
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
initWithTitle:@"Back"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(OnClick_btnBack:)];
self.navigationItem.leftBarButtonItem = btnBack;
[btnBack release];
答案 14 :(得分:5)
以下是答案:
在viewDidAppear:animated
(不在viewDidLoad
中)执行以下操作
- (void)viewDidAppear:(BOOL)animated
{
[self.navigationController.navigationBar.backItem setTitle:@"anything"];
// then call the super
[super viewDidAppear:animated];
}
如果你想保持后退按钮的形状。
答案 15 :(得分:5)
确定。我个人讨厌所有这些选择。所以我想出了自己的。
根据我所看到的信息。看起来,前一个视图控制器控制着自己的“后退”按钮,该按钮将显示在推送的视图控制器上。
我为需要更改后退按钮的控制器上的navigationItem创建了一个Lazy Load方法。
Mine是Invite Buyer Controller
Invite Buyer是默认设置的文本。
但后退按钮必须是邀请
以下是我用来创建后退按钮的代码。
我将此代码放在Controller的Implementatio(.m)文件的顶部,它会自动覆盖super的方法。
- (UINavigationItem *)navigationItem{
UINavigationItem *item = [super navigationItem];
if (item != nil && item.backBarButtonItem == nil)
{
item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
item.backBarButtonItem.title = @"Invite";
}
return item;
}
我觉得这是一种更优雅的方式来实现这一目标。
我将此代码放在一个位置,并在需要时自动填充。
无需在每次推送请求之前调用代码。
希望这有帮助
答案 16 :(得分:5)
对于Swift:
// Rename back button
let backButton = UIBarButtonItem(
title: "Back",
style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
target: nil,
action: nil
)
self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
答案 17 :(得分:5)
这里解释的解决方案都不适用于我。所以我做的是从我来自的场景中删除标题,方法如下:
self.title = @"";
因此,当出现新场景时,后面的文字不会出现。
我绝对同意这根本不是一个明确的解决方案,但是有效,并且没有一个解释为我工作。
答案 18 :(得分:4)
我是iOS的新手,但我将提供覆盖导航控制器类的非常简单的答案。 我有简单的覆盖push和pop方法并保存以前的视图控制器的标题。很抱歉在js块粘贴。有点困惑如何在正常的代码块中通过它。
#import "MyCustomNavController.h"
@implementation MyCustomNavController {
NSString *_savedTitle;
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
_savedTitle = self.topViewController.title;
self.topViewController.title = title;
[super pushViewController:viewController animated:animated];
}
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
[self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
return [super popViewControllerAnimated:animated];
}
@end
&#13;
答案 19 :(得分:4)
我发现,更改后退按钮名称的最简单方法是将视图控制器标题设置为后退按钮的标题,然后将视图控制器导航项中的titleView替换为自定义标签用它的真名。
像这样:
CustomViewController.m
@implementation CustomViewController
- (NSString*)title {
return @"Back Button Title";
}
- (void)viewDidLoad {
[super viewDidLoad];
UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
customTitleView.text = @"Navigation Bar Title";
customTitleView.font = [UIFont boldSystemFontOfSize:20];
customTitleView.backgroundColor = [UIColor clearColor];
customTitleView.textColor = [UIColor whiteColor];
customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
customTitleView.shadowOffset = CGSizeMake(0, -1);
[customTitleView sizeToFit];
self.navigationItem.titleView = [customTitleView autorelease];
}
@end
这将使您在UINavigationBar中的标题看起来好像是原生的。赋予视图控制器分离标题和后退标题的能力。
在视图控制器A和B的情况下,A负责告诉它的后退按钮应该看起来如何,同时显示B.
编辑:这也保持了后退按钮本机外观(左箭头栏按钮项目)。
答案 20 :(得分:4)
self.navigationController.navigationBar.backItem.title = @"TEXT";
在斯威夫特:
self.navigationController?.navigationBar.backItem?.title = "TEXT"
答案 21 :(得分:4)
此代码也有效。把它放在导航控制器的根控制器上:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
答案 22 :(得分:4)
我发现在推送到下一个视图控制器之前,最好将导航堆栈中当前视图控制器的标题更改为后退按钮的所需文本。
例如
self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];
然后在viewDidAppear中将标题设置回原始VC的所需标题。瞧!
答案 23 :(得分:3)
大多数解决方案都会杀死BackButton的原始样式(左箭头栏按钮),同时添加一个带有所需标题的常用按钮。
所以保持原有的风格有两种方式:
第一:使用我不想做的未记录的按钮样式(110或类似的东西)。但如果你想要,你可以在stackoverflow上找到如何做到这一点
第二:使用我的Trenskow的想法。我喜欢它,我使用它有点改变。
我没有覆盖 - (NSString *)标题,而是决定以下列方式保留原始标题(这允许我使用nib的标题以及在推状态btw时给定标题)。
- (void)viewDidLoad {
[super viewDidLoad];
static NSString * backButtonTitle=@"Back"; //or whatever u want
if (![self.title isEqualToString:backButtonTitle]){
UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
customTitleView.text = self.title; // original title
customTitleView.font = [UIFont boldSystemFontOfSize:20];
customTitleView.backgroundColor = [UIColor clearColor];
customTitleView.textColor = [UIColor whiteColor];
customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
customTitleView.shadowOffset = CGSizeMake(0, -1);
[customTitleView sizeToFit];
self.navigationItem.titleView = [customTitleView autorelease];
self.title = backButtonTitle;
}
}
此解决方案效果很好,看起来很原生。此外,如果在viewDidLoad方法中使用它,它会阻止执行超过1次 我也尝试过Jessedc的解决方案,但看起来很糟糕。它会导致用户标题栏在原始状态下变为可见,从原始状态变为BackButton所需的状态,然后返回。
答案 24 :(得分:3)
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc]
initWithTitle:@"Log out"
style:UIBarButtonItemStyleDone
target:nil
action:nil] autorelease];
您可以在parrent控制器的代码中随意添加它,这样您就可以为不同的子视图设置不同的后退按钮。
答案 25 :(得分:2)
我们有两个VC的A和B.
如果要更改B中的标题,请在A
中编写此代码- (IBAction)goToBViewController:(UIButton *)sender {
BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[self.navigationController pushViewController:vc animated:NO];
}
Swift 4.1 Xcode 9.4
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
答案 26 :(得分:2)
这对我来说是以前发布的答案的“简化”版本。
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];
backButton.title = @"Go Back";
self.navigationItem.backBarButtonItem = backButton;
请记住将代码放在父视图控制器中(例如,具有您的表视图或UITableViewController的视图),不子视图或详细视图(例如UIViewController)。
您可以轻松地本地化后退按钮字符串,如下所示:
backButton.title = NSLocalizedString(@"Back Title", nil);
答案 27 :(得分:1)
问题:&#34;返回&#34;导航栏中的文字无法替换。
原因:&#34;返回&#34;由于父视图控制器中的.title属性设置为nil(或未初始化),因此在推送视图后在导航栏中设置了label。
一个解决方案:如果你设置self.title =&#34; Whatever ...&#34;你会看到而不是&#34; Back&#34;将出现&#34;无论......&#34;推新视图控制器后。
答案 28 :(得分:1)
根据UINavigationBar
&gt; backItem
如果最顶层导航项的leftBarButtonItem属性是 nil,导航栏显示一个后退按钮,其标题是派生的 来自此属性中的项目。
但是设置backItem.backBarButtonItem
在第一次viewWillAppear中不起作用。设置topItem.backBarButtonItem
仅适用于第一次viewWillAppear。因为navigationBar.topItem
仍然指向previousViewController.navigationItem
。在viewWillLayoutSubviews
中,topItem
和backItem
会更新。因此,在第一次viewWillAppear
之后,我们应该设置backItem.backBarButtonItem
。
答案:无论当前viewController(顶级viewController)中的何时何地,都将backBarButtonItem
设置为前一个viewController的navigationItem
。您可以在viewWillAppear
或viewDidLoad
中使用此代码。查看我的博文iOS Set Navigation Bar Back Button Title进行详细分析。
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];
}
答案 29 :(得分:1)
使用以下代码行:
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"hello"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil];
self.navigationItem.leftItemsSupplementBackButton = YES;
答案 30 :(得分:1)
如果您不仅要将“后退”按钮的文本更改为相同的文本并保持原始的左箭头形状,而且还要在用户单击“后退”按钮时执行某些操作,我建议您查看我的“CustomNavigationController”。
答案 31 :(得分:1)
Swift 4
iOS 11.2
Xcode 9.2
TableViewController1 ---segue---> TableViewController2
您可以在TableViewController1或TableViewController2中更改后退按钮的文本。
更改TableViewController1中的后退按钮文本:
1)在viewWillAppear()
:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let myBackButton = UIBarButtonItem()
myBackButton.title = "Custom text"
navigationItem.backBarButtonItem = myBackButton
}
由于某种原因,viewDidLoad()太早,无法将后退按钮添加到NavigationItem。要连接两个TableViewControllers,在storyboard控件中将TableViewController1中的TableViewCell拖动到TableViewController2的中间,然后在弹出菜单中选择Selection Segue > Show
。
2)在tableView(_:didSelectRowAt:)
:
override func tableView(_ tableView: UITableView, didSelectRowAt: IndexPath) {
let myButton = UIBarButtonItem()
myButton.title = "Custom text"
navigationItem.backBarButtonItem = myButton
performSegue(withIdentifier: "ShowMyCustomBackButton", sender: nil)
}
要连接两个TableViewControllers,在storyboard控件中从TableViewController1上方的小黄色圆圈拖动到TableViewController2的中间,然后从弹出菜单中选择Manual Segue > Show
。然后选择连接两个TableViewControllers的segue,并选择&#34; Identifier&#34;旁边的Attributes Inspector。输入&#34; ShowMyCustomBackButton&#34;。
3)在storyboard
:
如果您只需要后退按钮的静态自定义文本,请选择TableViewController1的NavigationItem(它在故事板的目录中有一个<
图标),然后打开属性检查器并在“返回按钮“字段输入您的自定义文本(确保选中该字段以使更改生效)。
更改TableViewController2中的后退按钮文本:
1)在viewWillAppear()
:
class MySecondTableViewController: UITableViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let myBackButton = UIBarButtonItem(
title: "<Custom text",
style: .plain,
target: self,
action: #selector(goBack) //selector() needs to be paired with an @objc label on the method
)
navigationItem.leftBarButtonItem = myBackButton
}
@objc func goBack() {
navigationController?.popViewController(animated: true)
}
要连接两个TableViewControllers,在storyboard控件中将TableViewController1中的TableViewCell拖动到TableViewController2的中间,然后在弹出菜单中选择Selection Segue > Show
。
答案 32 :(得分:1)
static NSString * back_button_title=@"Back"; //or whatever u want
if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
custom_title_view.text = view_controller.navigationItem.title; // original title
custom_title_view.font = [UIFont boldSystemFontOfSize:20];
custom_title_view.backgroundColor = [UIColor clearColor];
custom_title_view.textColor = [UIColor whiteColor];
custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
custom_title_view.shadowOffset = CGSizeMake(0, -1);
[custom_title_view sizeToFit];
view_controller.navigationItem.titleView = custom_title_view;
view_controller.navigationItem.title = back_button_title;
}
在我自己的使用中,我使它成为这样的函数,只需在viewDidLoad中使用一行代码。
+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
static NSString * back_button_title=@"Back"; //or whatever u want
if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
custom_title_view.text = view_controller.navigationItem.title; // original title
custom_title_view.font = [UIFont boldSystemFontOfSize:20];
custom_title_view.backgroundColor = [UIColor clearColor];
custom_title_view.textColor = [UIColor whiteColor];
custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
custom_title_view.shadowOffset = CGSizeMake(0, -1);
[custom_title_view sizeToFit];
view_controller.navigationItem.titleView = custom_title_view;
view_controller.navigationItem.title = back_button_title;
}
}
答案 33 :(得分:0)
似乎导航控制器正在寻找
previousViewController.navigationItem.title
如果没有,它会寻找
previousViewController.title
答案 34 :(得分:0)
这对我来说适用于Swift 4和iOS 11.当用户点击表格视图中的一行并且新的视图控制器被推送到导航堆栈时,我通常需要这样做。通常我希望后退按钮是被点击的行所代表的对象的名称或某些属性。所以我通常在didSelectRowAt...
这样做:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let object = // get the object this row represents
let backButton = UIBarButtonItem()
backButton.title = object.name // or whatever
self.navigationItem.backBarButtonItem = backButton
// now show or segue to the next view controller
}
答案 35 :(得分:0)
如果导航不止一个
ParentViewController-> ChildViewController1-> ChildViewController2
您可以使用以下代码更改导航栏上的后退按钮的标题。
self.navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem.init(title:“ Back”,style:.plain,target:nil,action:nil)
答案 36 :(得分:0)
将 backButtonTitle
设置为上一屏幕的空格。
// If navigation is from A -> B, set in A's `viewDidLoad`.
navigationItem.backButtonTitle = " "