当前左边栏按钮的默认值是加载当前视图的视图的标题,换句话说,当按下按钮(后退按钮)时显示的视图。

我想把按钮上显示的文本更改为其他内容。

我试着把下面这行代码放在视图控制器的viewDidLoad方法中,但它似乎不起作用。

self.navigationItem.leftBarButtonItem.title = @"Log Out";

我该怎么办?

谢谢。


当前回答

这是另一种方法。

在你的父视图控制器中,实现以下方法:

- (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数组中抓取倒数第二个视图控制器指向父视图控制器,我可以用那个引用正确地调用父方法。

其他回答

好的。我个人讨厌所有这些选择。因此我想出了我自己的。

根据我所看到的信息。看起来Previous视图控制器控制着它自己的“Back”按钮,该按钮将显示在被推的视图控制器上。

我已经为控制器上想要更改Back Button的navigationItem创建了一个Lazy Load方法。

我的是一个邀请买家控制器

邀请买家是默认设置的文本。

但后退按钮需要是“邀请”

下面是我用来创建后退按钮的代码。

我把这段代码放在Controller's 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;
}

我觉得这是一种更优雅的方式。

我把这些代码放在一个地方,在需要时自动填充。

不需要在每个推送请求之前调用代码。

希望这能有所帮助

我有一个父视图控制器,标题很长。这导致后退按钮的文本溢出到子视图控制器的标题中。

在尝试了一堆不同的解决方案后,这就是我最终所做的(扩展@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。

在某些情况下,改变父视图控制器的标题是最快的解决方案。但是,这会改变父标题,因此您必须管理状态。标签栏控制器也会变得混乱,因为标题更改会对标签栏项目标题产生副作用。

我在iOS新,但我会提供我的覆盖导航控制器类的非常简单的答案。 我有简单的覆盖推和弹出方法,并保存以前的视图控制器的标题。抱歉在js block中进行了粘贴。有点困惑如何过去它在正常的代码块。

#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

斯坦的回答是最好的。但它也有一个问题,当你使用带有标签栏的控制器并更改控制器的标题时,你也可以更改标签栏的标题。所以最好的答案是改变view_controller。navigationitem。只使用view_controller.navigationItem。函数中的标题。 答案在这里:(使用ARC并将它们添加到视图的viewDidLoad中)

  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;
  }
}

iOS 11+解决方案-不需要再次创建后退按钮。

将backButtonTitle设置为前一屏幕上的一个空格。

// If navigation is from A -> B, set in A's `viewDidLoad`.
navigationItem.backButtonTitle = " "