更改UIBackButtonItem标题

时间:2009-01-31 01:32:59

标签: cocoa-touch

我有一个基于navigationController的应用程序。我想更改根视图控制器的后退按钮的标题。我在rootViewController的viewDidLoad方法中尝试了以下代码,但没有成功:

self.navigationItem.backBarButtonItem.title = @"Back";

有什么想法吗?

14 个答案:

答案 0 :(得分:52)

我通过创建自己的UIBarButtonItem而不是设置现有的标题来取得成功:

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

答案 1 :(得分:47)

后退按钮的标题是:

  1. 上一个视图控制器的标题
  2. 上一个视图控制器的导航项目后退按钮的名称
  3. 如果要为当前视图控制器的导航项设置后退按钮,则不会设置在当前视图中显示的按钮。实际上,如果从其中推送另一个视图控制器,则设置后退按钮。

答案 2 :(得分:25)

可能已经回答了,但不是简单的。

self.navigationItem.backBarButtonItem默认为nil。因此,如果您将标题设置为它,则不会发生任何事情,因为它会影响nil地址对象。这不会引发错误,因为objective-c允许消息传递nil对象。

答案:您必须创建自己的按钮对象才能设置标题。您可以initWithTitle或创建它,然后设置标题。

PS - 如上所述,backBarButtonItem仅影响它在导航堆栈中推送到其上的子视图。根据您的应用程序架构的方式,根视图不能再进一步弹出,也不能有后退按钮。但是,您可以影响leftBarButtonItem

答案 3 :(得分:5)

后退按钮从父视图控制器的标题中提取其文本。

在父视图控制器(点击后退按钮时显示的视图控制器)中,将自己的标题设置为后退按钮上的所需文本。

例如,假设我们有一个RootViewController类。当我们在表视图中单击一个单元格时,我们会推送SecondViewController的实例。我们希望SecondViewController实例的后退按钮为“Home”。

RootViewController.m viewDidLoad方法中的

self.title = @"Home";
SecondViewController.m viewDidLoad方法中的

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

如果您希望后退按钮阅读“返回”,请将父视图控制器的标题设置为@"Back";

答案 4 :(得分:1)

您不能简单地更改根视图控制器中后退按钮的标题,因为根视图控制器未显示后退按钮。毕竟它是根,你能回到什么?虽然您的应用程序中可能存在某些逻辑,但默认实现应该没有什么明显的。

你可以在那里放置一个自定义按钮而不是你真的想在那里想要一个控件(制作一个UIBarButtonItem并将navigationItem.backBarButtonItem设置为它),虽然它不会像默认的那样具有相同的外观(它将是一个正方形,而不是箭头)。

答案 5 :(得分:1)

Mihai Damian和Chris Lundie的回答是正确的。

另外需要注意的是,如果在设置自定义navigationItem.backBarButtonItem后更改viewController的navigationItem.title,它将返回其默认状态,即丢弃自定义backBarButtonItem,而是使用新标题刚刚设定。

所以,我确保每当我更改viewController的标题时都会重新设置backBarButtonItem:

self.navigationItem.title = @"New Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];
backButton.title = @"Back";
self.navigationItem.backBarButtonItem = backButton;

答案 6 :(得分:0)

您的问题可能与此处描述的问题非常相似:http://blog.tmro.net/2009/05/uitabbarbuttonitem-did-not-change-its.html

尝试调试以查看是否为您的按钮设置了_barButtonItemFlags ...

答案 7 :(得分:0)

正如前面提到的海报(Brenden)所提到的,默认情况下backBarButtonItem的值为nil,因此设置其标题会导致向nil对象发送消息,这当然会被忽略。

如果您不想手动创建新按钮以设置其标题,可以在Interface Builder中进行解决。

在IB中,对于属于navigationController堆栈的给定视图控制器,您可以单击表示navigationBar的navigationItem。单击时,属性检查器允许您设置三个属性:Title,Prompt和BackButton。

如果在backButton字段中键入任何旧的随机文本,这具有实例化backBarButtonItem对象的效果,并且在您的代码中,您现在可以将其标题设置为您想要的任何文本。

希望这有助于某人。

答案 8 :(得分:0)

也许你不是每个推动viewController的viewController都有一个取消按钮而不是在显示viewController中用自定义标题设置一个leftBarButtonItem

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", @"") style:UIBarButtonSystemItemCancel target:self action:@selector(popViewController)] autorelease];

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

答案 9 :(得分:0)

假设:在你的导航控制器中有两个ViewController RootViewController DetailViewController

  • 第一步: 您必须覆盖 RootViewController

    的标题
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"backTitle" style:UIBarButtonItemStylePlain target:nil action:nil];
    
  • 第二步:

    [self.navigationController pushViewController:detailVC animated:YES];

那已经完成了!您将看到DetailViewController的后退按钮是“backTitle”

答案 10 :(得分:0)

- (void)pushViewController:(UIViewController *)controller 
             withBackTitle:(NSString *)backTitle 
                  animated:(BOOL)animated {
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backTitle
                                                                             style:UIBarButtonItemStyleDone
                                                                            target:nil
                                                                            action:nil];
    [self.navigationController pushViewController:controller animated:animated];
}

它是有效的。

答案 11 :(得分:-1)

这是最好的解决方案,不要像往常一样设置navigationitem标题 self.navigationitem.title。将此代码放在父视图didload

    CGRect frame = CGRectMake(0, 0, 320, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor whiteColor];

self.navigationItem.titleView = label;
label.text = @"My Navigation Bar";

通过将标题设置为上面,实际的导航标题将为零,因此backbarbutton标题将自动为“Back”

答案 12 :(得分:-1)

self.navigationController.navigationBar.backItem.title = @"TEXT";

答案 13 :(得分:-1)

我有一个有趣的解决方案:

在导航到第二个视图(IBAction或didSelectRaw等)的方法中,我在后面项目的标题中更改为我想要的标题,例如:self.title = @"Inbox";。另外,我添加方法ViewWillApear,以便在用户点击返回主标题时更改标题。