1

我正在通过以下方式更改控制器的 viewDidAppear 中的后退按钮项目标题:

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

它正确地改变了标题,但我的行为很奇怪。当我选择“上一个”按钮时,它会更改堆栈中的控制器的标题(即父控制器现在具有“上一个”的标题。

你现在知道为什么会这样吗?

4

1 回答 1

0

当您使用导航控制器时,调用 [self setTitle:@"Title"]; 在堆栈中的任何视图控制器内部都将设置导航栏标题。当您推送新的视图控制器时,这也是后退按钮默认使用的标题。显然,根据您的体验,明确设置 backItem 的标题,还将其设置为前一个视图控制器的导航栏标题,覆盖视图控制器中对 -setTitle 的调用中指定的任何内容。

您最好只从导航堆栈中的视图控制器中管理标题。当你去推送一个新的视图控制器时,这样做:

[self setTitle:@"Previous"];
NextViewController *controller = [[NextViewController alloc] init];
[[self navigationController] pushViewController:controller animated:YES];
[controller release], controller = nil;

现在,当显示下一个视图控制器时,后退按钮会显示“上一个”。现在,您只需将其更改回其真实标题应位于 -viewWillAppear 中的任何内容:

- (void)viewWillAppear:(BOOL)animated;
{
    [self setTitle:@"Real Title"];
    [super viewWillAppear:animated];
}

它可能会让人觉得有点 hacky,但它比尝试覆盖导航栏功能要好。与导航栏/导航控制器堆栈搏斗可能会非常令人沮丧。

最好的祝福。

于 2010-06-16T17:20:45.563 回答