UINavigationController“后退按钮”自定义文本?

时间:2009-09-17 22:46:21

标签: ios iphone uinavigationcontroller

默认情况下,UINavigationController的“后退按钮”显示堆栈中最后一个视图的标题。有没有办法在后退按钮中设置自定义文本?

16 个答案:

答案 0 :(得分:340)

来自this link

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

正如泰勒在评论中所说:

  

不要在可见视图控制器中执行此操作,而是在视图中执行此操作   如果你点击后退按钮,你会看到的控制器

答案 1 :(得分:42)

您可以在界面生成器中设置文本:

选择后退按钮将返回的ViewController的导航项:

enter image description here

在实用工具面板属性检查器中,输入后退按钮的标签:

enter image description here

我更喜欢这种方法而不是在接受的答案中设置代码中的标题。

  

另请注意,您需要在视图控制器的一个级别上执行此操作   堆。换句话说,不要在可见视图控制器中执行此操作,   但在视图控制器中,如果按下后退按钮,则会看到   的 - 泰勒

答案 2 :(得分:22)

我用这个:

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

答案 3 :(得分:11)

通过在将另一个控制器推入堆栈之前简单地设置控制器的标题,我找到了一个方便的解决方案,如下所示:

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

然后,请务必在viewWillAppear中设置原始标题,如下所示:

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

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

答案 4 :(得分:7)

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

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

答案 5 :(得分: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;
}

然后添加一个简单的方法,以允许viewcontroller解雇:

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

答案 6 :(得分:3)

在viewDidLoad或loadView

中添加以下代码
self.navigationController.navigationBar.topItem.title = @"Custom text";

我使用iOS 9在iPhone和iPad上进行了测试

答案 7 :(得分:2)

添加到缰绳的答案。请注意Apple的文档中 backBarButtonItem 的声明是这样的:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

因此,rein的回答会泄漏内存,因为合成的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];

希望这有帮助!

答案 8 :(得分:2)

- (void)viewDidLoad {
  [super viewDidLoad];

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

答案 9 :(得分: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,将自动在其中包含“后退”按钮。如果你想更改某些视图控制器的文本,你可以尝试将viewcontroller转换为某个类或你自己的自定义协议(你的viewcontroller继承自哪个可能有backButtonText之类的方法或类似的东西)它可以为您提供有关视图控制器的某些信息,您可以自定义它的后退按钮文本。现在,后退按钮文本将在一个应该承担责任的地方进行处理。我不得不承认创建一个新的按钮来改变文字很糟糕,但是哦。好吧。

任何人都可以想到为什么不这样做?至少你不必摆弄视图控制器标题,或者在按下导航控制器上的视图控制器之前必须记住创建一个新的后退按钮。

答案 10 :(得分:0)

扩展Aubrey的建议,您可以在子视图控制器中执行此操作:

创建两个变量来存储父级的navigationItem.title和父级的navigationItem的旧值

UINavigationItem* oldItem;
NSString* oldTitle;

viewDidLoad中添加以下内容:

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

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

答案 11 :(得分:0)

缰绳的答案效果很好。

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

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

此外,请确保在按下视图控制器之前执行此操作,否则在标题更改时会出现屏幕打嗝。

答案 12 :(得分:0)

把它放到你viewDidLoad中,希望它会产生你想要的东西

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

答案 13 :(得分:0)

如果你想在ARRIVING控制器中设置标题(有时更多的逻辑......) 在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放在控制器扩展中。

答案 14 :(得分:0)

我知道这是一个古老的问题,答案的种类已经更新!

最简单的方法是在父级ViewController中执行此操作:

即将您带到下一个视图控制器的地方。

<div class="lasvegas">
Events</div>
<div class="findanevent"> </div>
<div class="event_wrapper"><a 
href="https://adsler.co.uk/find-an- 
event/"><span id="findanevent" 
class="event">Find an Event</span>. 
</a>
<a href="https://adsler.co.uk/post- 
an-event/"><span id="postanevent" 
class="event">Post an Event</span>. 
</a></div>

答案 15 :(得分:-1)

在代码中执行此操作会删除UINavigationConroller的后退按钮样式。如果您在每个视图中添加导航项,则可以在StoryBoard中设置后边框的标题。