2009-09-17 139 views

回答

334

this link

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

正如泰勒在评论中说:

不可见视图控制器做到这一点,但在视图 控制器,你会看到如果你点击后退按钮

+4

你应该释放'UIBarButtonItem'。 – 2009-09-17 22:53:27

+213

另外请注意,您需要在视图控制器的堆叠中的一级上执行此操作。换句话说,不要在可见视图控制器中这样做,而是在视图控制器中,如果你点击后退按钮,你会看到它。 – Tyler 2009-09-17 23:07:03

+0

非常感谢泰勒。你的评论为我节省了很多时间! – 2011-04-15 20:14:25

11

我发现了一个方便的解决方案通过简单的设置推另一个控制器到堆栈,这样之前控制器的标题:

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

然后,确保设置原稿标题viewWillAppear,像这样:

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

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

+1

这个问题是旧视图中的标题更改动画出来,看起来有点尴尬。这里给出的解决方案似乎没有工作,因为你想:-( – 2010-06-06 15:28:07

+1

这是完美的我的情况,因为我没有显示在上一个屏幕上的NavBar,我只是想从后面的按钮上删除titleLabel新屏幕,并且只有iOS7 V形箭头,因此我可以为标题设置一个空的NSString文字。 – siburb 2013-10-31 10:54:56

+0

推动视图控制器在点击时触发异常 – Sumit 2016-12-15 11:18:51

0

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

viewDidLoad用于存储父navigationItem.title的旧值创建两个变量和家长的navigationItem

UINavigationItem* oldItem; 
NSString* oldTitle; 

,添加以下内容:

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 

这并不完美。当新的控制器被动画时,您会看到父视图更改的标题。但是,这确实实现了自定义标记后退按钮并将其保持为标准后退按钮的目标。

21

我用这个:

// 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"; 
} 
+0

这几乎适用于我,但是当我单击后退按钮时,在动画的持续时间内,文本将变回父母的标题:-( – 2010-06-06 15:25:19

+3

这将更改堆栈中控制器的后退按钮标题,但不会更改当前显示的控制器的后退按钮标题 甚至更糟糕的是:它改变了控制器之前的控制器的标题! – leviathan 2010-07-05 14:05:00

+0

A由其他评论者指出,这种方法有点站不住脚。我不会推荐这样做,因为它实际上并不是API如何使用它。你可以在未来设置自己的困难错误! – RickDT 2012-05-03 14:42:23

6

在你的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; 
} 

然后添加一个简单的方法,以使视图 - 控制解聘:

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

加入缰绳的答案。从苹果公司的文档需要注意的是backBarButtonItem的声明是这样的:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem 

因此,收服的回答将导致内存泄漏,因为合成的setter方法retain你通过它的实例,这是从来没有明确地释放。您可以通过使用autorelease

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

解决这个问题或者你也可以在实例指向一个变量,因此您可以稍后明确释放它:

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

希望这有助于!

+0

现在注意,使用ARC,您不必担心autorelease(如果您尝试在启用ARC的项目中尝试自动释放,编译器会发生错误) – 2012-08-22 23:58:57

2
- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

雷的答案效果很好。

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

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

另外,请确保在之前按,否则在标题更改时会出现屏幕呃逆。

7

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

-(void)viewWillAppear:(BOOL)animated { 

    // Set title 
    [email protected]"Original Title"; 
} 

-(void)viewWillDisappear:(BOOL)animated { 

    // Set title 
    [email protected]"Back"; 
} 
+0

这很有效对于很多情况,这很简单...只有观察到覆盖这些方法中的任何一个都需要在新方法的某个时刻调用super的实现。 – izk 2012-12-19 01:31:31

+2

使用这种方法,人们会注意到在推动动画发生之前,父视图的标题被改为“后退”。 (而且,很糟糕的是,如果你把它移动到viewDidDisappear方法中,你会看到开关在推后发生..) – 2013-01-15 12:40:44

+0

我喜欢这种方法,但我面对的这个问题是,“原始标题”被设置好吧,但如果长度比“返回”长,它会附带省略号,因为视图不在视图层次结构中,因此它不会重新放置标题视图。由于动画的初始速度很快,上述@JamesBoutcher描述的问题对我来说并不明显。事实上,我刚刚意识到我面临的问题尤其值得注意,因为这个问题突出时,结束动画缓慢。 – trss 2014-01-24 17:13:11

2

我发现了一些有趣的东西。 如果子类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与您的导航控制器推将有“返回“按钮自动。如果你想改变某些视图控制器的文本,你可以尝试将视图控制器投射到某个类或你自己的自定义协议(你的视图控制器继承自其中的方法可能有一个像backButtonText或类似的东西),它可以给你有关于视控制器的某些信息,你可以自定义它的后退按钮文本。现在后退按钮文本在应该单独承担责任的地方照顾。我不得不承认,创建一个新的按钮来改变文字糟透了,但哦。

任何人都可以想到为什么不这样做的原因?至少您不必调整viewcontroller标题,或者必须记住在推动导航控制器上的viewcontroller之前创建一个新的后退按钮。

0

将这个变成你viewDidLoad,希望这将导致到你正在寻找

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

你可以设置在界面生成器的文本:

选择视图控制器的导航项目的后退按钮将返回:

enter image description here

在公用事业面板属性inspecto R,输入你的标签的后退按钮:

enter image description here

我宁愿这种做法在设置代码中的标题为接受的答案。

另外请注意,您需要在视图控制器上层 堆栈中执行此操作。换句话说,不要在可见视图控制器 中执行此操作,但在视图控制器中,如果您点击后退按钮,则会看到该控制器。
--Tyler

+0

这是迄今为止发现的最佳答案。 – 2014-03-08 21:15:22

+2

要清楚,这需要在视图控制器的导航项上设置,而不是在视图控制器的属性检查器本身上。 – 2014-04-21 14:39:41

+0

这是我找到的最佳答案。 – bicepjai 2014-04-27 01:13:42

-1

代码实现这一点删除UINavigationConroller的后退按钮样式。如果您在每个视图中添加导航项目,则可以在StoryBoard中设置后端乐章的标题。

2

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

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

我与iOS 9

+0

应该是self.navigationController?.navigationBar.backItem?.title =“自定义文本” – Peacemoon 2016-06-02 13:03:49

+0

唯一的区别我需要的是'navigationController'和'topItem'属性的可选链接,例如: 'self.navigationController?.navigationBar.topItem?.title =“自定义文本” – Bulwinkel 2016-06-08 14:42:04

0

测试了它的iPhone和iPad,如果你想设置标题在抵达控制器(有时更多的逻辑..) 在SWIFT 3做:

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放在控制器扩展中。