UINavigationController“后退button”自定义文本?

默认情况下,“后退button”显示堆栈中最后一个视图的标题,是否有方法可以在后退button中使用自定义文本?

从这个链接 :

 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Custom Title" style:UIBarButtonItemStylePlain target:nil action:nil]; 

正如泰勒在评论中所言:

不要在可见视图控制器中这样做,而是在视图控制器中,如果你点击后退button,你会看到

您可以在Interface Builder中设置文本:

select后退button将返回到的ViewController的导航项目:

在这里输入图像说明

在“实用程序”面板属性检查器中,为“后退”buttoninput标签:

在这里输入图像说明

我更喜欢这种方法,在接受的答案中设置标题的代码。

另外请注意,您需要在视图控制器的堆叠中的一级上执行此操作。 换句话说,不要在可见视图控制器中这样做,而是在视图控制器中,如果您点击后退button,就会看到这个控制器。
–Tyler

我使用这个:

 // In the current view controller, not the one that is one level up in the stack - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.navigationBar.backItem.title = @"Custom text"; } 

我发现一个方便的解决scheme,只需设置控制器的标题,然后再推入另一个控制器,如下所示:

 self.navigationItem.title = @"Replacement Title"; [self.navigationController pushViewController:newCtrl animated:YES]; 

然后,确保在viewWillAppear设置原始标题,如下所示:

 -(void)viewWillAppear:(BOOL)animated { ... self.navigationItem.title = @"Original Title"; ... } 

这是可行的,因为在推送操作期间构build后退button时, UINavigationController的默认行为是使用前一个控制器中的标题。

后退button的标题默认为前一个视图的标题,所以我使用的一个快速技巧是将以下代码放在前一个视图的.m文件中。

 -(void)viewWillAppear:(BOOL)animated { // Set title self.navigationItem.title=@"Original Title"; } -(void)viewWillDisappear:(BOOL)animated { // Set title self.navigationItem.title=@"Back"; } 

在你的init方法中,添加下面的代码:

 - (id)initWithStyle:(UITableViewStyle)style { if(self = [super init]) { //... UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(goBack)]; self.navigationItem.leftBarButtonItem = customBackButton; [customBackButton release]; //... } return self; } 

然后添加一个简单的方法,以允许viewcontroller解雇:

 -(void)goBack { [self.navigationController popViewControllerAnimated:YES]; } 

加上缰绳的答案。 请注意苹果的文档, backBarButtonItem的声明是这样的:

 @property(nonatomic, retain) UIBarButtonItem *backBarButtonItem 

因此,rein的答案会泄漏内存,因为合成的setter将retain你传递的实例,这个实例永远不会被明确地释放。 你可以通过使用autorelease来解决这个问题

  self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" style:UIBarButtonItemStyleBordered target:nil action:nil] autorelease]; //<-- autoreleased 

或者你可以在实例中指定一个variables,以便以后可以明确地释放它:

 UIBarButtonItem* item = ... self.navigationItem.backBarButtonItem = item; [item release]; 

希望这可以帮助!

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; } 

我发现了一些有趣的东西。 如果你inheritance了UINavigationController并覆盖了pushViewController:animated:方法,并执行如下操作:(请记住,我正在使用ARC)

 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Back" style: UIBarButtonItemStyleBordered target: nil action: nil]; viewController.navigationItem.backBarButtonItem = backButton; [super pushViewController:viewController animated:animated]; 

然后,所有使用导航控制器推送的ViewControllers将自动具有“返回”button。 如果你想改变某些视图控制器的文本,你可以试着将视图控制器转换成一个特定的类或者你自己的自定义协议(你的视图控制器inheritance自其中的一个方法,像backButtonText或类似的东西)你在视图控制器的某些信息即将到来,您可以自定义后退button文本。 现在后退button文本在应该单独承担责任的地方照顾。 我不得不承认,创build一个新的button来改变文本糟透了,但哦。

任何人都可以想到为什么不这样做的原因? 至less你不必小看viewcontroller标题,或者必须记住在推动导航控制器上的viewcontroller之前创build一个新的后退button。

在viewDidLoad或loadView中添加下面的代码

 self.navigationController.navigationBar.topItem.title = @"Custom text"; 

我使用iOS 9在iPhone和iPad上testing了它

缰绳的答案效果很好。

请注意,如果您推送多个视图控制器,则会为每个视图控制器显示更改的后退button标题,这可能不是您想要的。

在这种情况下,每次按下视图控制器时都需要创build自定义的UIBarButtonItem。

另外,请确保按下视图控制器之前执行此操作,否则在标题更改时会出现屏幕呃逆。

扩展奥布里的build议,你可以在子视图控制器中做到这一点:

创build两个variables来存储父级的navigationItem.title和父级的navigationItem的旧值

 UINavigationItem* oldItem; NSString* oldTitle; 

viewDidLoad ,添加以下内容:

 oldItem = self.navigationController.navigationBar.topItem; oldTitle = oldItem.title; [oldItem setTitle: @"Back"]; 

viewWillDisappear ,添加以下内容:

 [oldItem setTitle: oldTitle]; oldTitle = nil; // do this if you have retained oldTitle oldItem = nil; // do this if you have retained oldItem 

这并不完美。 当新的控制器被animation时,你会看到父视图改变的标题。但是这样做的目的是自定义后退button的标签并保持它像一个标准的后退button。

把它放到你的viewDidLoad ,希望它会导致你正在寻找的东西

 UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backBarButtonItem; [backBarButtonItem release]; 

如果你想快速的在ARRIVING控制器中设置标题(有时候更多的逻辑..)做:

 func setBackButtonNavBar(title: String, delay: Double){ let when = DispatchTime.now() + delay DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in if let navBar = self.navigationController?.navigationBar{ navBar.backItem?.title = title } }) } 

即将到来的控制器

 override func viewDidLoad() { super.viewDidLoad() self.setBackButtonNavBar(title: "back", delay: 0.3) } 

通常我把self.setBackButtonNavBar放在一个控制器扩展中。

在代码中执行此操作将删除UINavigationConroller的后退button样式。 如果您在每个视图中添加导航条目,则可以在StoryBoard设置后面的标题。