2012-02-26 64 views
1

我有 ViewController和详细 ViewController。当我推到detailedViewController我得到leftBarButtonItem标题从根。但我希望标题只是“返回”,没什么更多。那么该怎么做?如何将标题设置为leftBarButtonItem

这不利于

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

要创建我的类型barButtonItem(例如104与左箭头)和将其设置为leftBarButtonItem是可怕的决定。

除了在推送之前手动更改rootViewController的标题还有其他方法吗?

+0

已经有关于这个问题,在那里很多问题。像http://stackoverflow.com/questions/2197698/how-to-set-the-text-of-a-back-button-on-a-uinavigationbar并从那里,还有更多的要遵循。 – 2012-02-26 09:49:42

+0

啊哈,对不起,遗憾的是 – Buron 2012-02-26 09:52:06

+0

@Buron你是什么意思与可怕的决定? – 2012-02-26 11:27:31

回答

6

从苹果的doc:

backBarButtonItem

酒吧按钮项目时,需要在 导航栏上的后退按钮使用。

@属性(非原子,保留)的UIBarButtonItem * backBarButtonItem 讨论

当此导航产品立即在 堆栈顶部项目下方,导航控制器导出用于从该导航 导航栏的返回按钮项目。当此属性为零时,导航项目使用其标题属性中的值创建 适当的后退按钮。 如果您想为后退按钮指定自定义图像或 标题,则可以将自定义条形按钮项目 (包含您的自定义标题或图像)分配给此属性,而不是。当配置您的酒吧按​​钮项目 时,不要分配一个自定义的视图; 无论如何,导航项会忽略后栏按钮 中的自定义视图。

因此,您可以创建创建barButtonItem(例如– initWithTitle:style:target:action:)并将其分配给该属性。

另外,如果你想有一个自定义图像UIBarButtonItem(左或右),我建议你创建一个类扩展如下所示:

//UIBarButtonItem+Extension.h  
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image title:(NSString*)title target:(id)target action:(SEL)action; 

//UIBarButtonItem+Extension.m  
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image title:(NSString*)title target:(id)target action:(SEL)action 
{ 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    button.titleLabel.textAlignment = UITextAlignmentCenter; 

    [button setBackgroundImage:image forState:UIControlStateNormal]; 
    [button setTitle:title forState:UIControlStateNormal]; 
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem* barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

    return [barButtonItem autorelease];  
} 

,然后用它作为

UIBarButtonItem* backBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"YoutImageName"] title:@"YourTitle" target:self action:@selector(doSomething:)]; 
1
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] init]; 
backButtonItem.title = NSLocalizedString(@"Back", nil); 
self.navigationItem.backBarButtonItem = backButtonItem; 
+0

UINavigationItem属性backBarButtonItem需要一个UIBarButtonItem类型的实例,而不是NSString类型的实例。这样做很可能会导致崩溃。 – Tom 2012-02-26 13:23:19

+1

您是对的,抱歉,我从代码中复制它时犯了错误。 – Franck 2012-02-26 13:37:10

5

我终于想出了今天的所有皱纹,而且上面更简单。

孩子的后退按钮文本是基于其父项中设置的值。当你考虑这个问题时,这是显而易见的行为:如果一个视图控制器可以从两个父母那里得到,那么后退按钮的文本应该取决于推送它的哪一个。

如果文本始终是相同的:

  1. 在编辑器中选择父视图控制器的导航项目
  2. 将文字放入后退按钮的值。

就这样你就完成了。当这个视图控制器被一个新的视图控制器推到一边时,这个新的视图控制器会将这个文本作为它的标题。

如果文字是动态的:

  1. 在编辑器中选择父视图控制器的导航项目
  2. 一些文字放入后退按钮值。
  3. 设置标题时,就应该在视图控制器改变:self.navigationItem.backBarButtonItem.title = dynamicText;

,并再次就大功告成了。

要清楚,您可以随时在父视图控制器中设置此项。只有在推入另一个视图控制器时才会显示。

如果你不把在设计师的后退按钮文字,实例化视图控制器的过程中不会产生self.navigationItem.backBarButtonItem,你不能设置一个nil对象的标题。我相信这就是所有这些混乱的根源所在。

当然,你可以在运行时创建它,但是如果你已经在故事板/笔尖中完成了大部分工作,那么让解码器为你做更容易。

如果您对此更加好奇,我也只是写了一篇关于这个主题的博客文章。它有一些more details

0

它为我的作品:

[self.navigationItem.leftBarButtonItem setTitle:@"Back"];

(后退箭头图像和自定义文本)