繁体   English   中英

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

[英]UINavigationController “back button” custom text?

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

这个链接

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

正如泰勒在评论中所说:

不要在可见视图控制器中执行此操作,而是在视图控制器中执行此操作,如果您单击后退按钮

您可以在Interface Builder中设置文本:

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

在此输入图像描述

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

在此输入图像描述

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

另请注意,您需要在视图控制器的一层上方执行此操作。 换句话说,不要在可见视图控制器中执行此操作,而是在视图控制器中执行此操作,如果您单击后退按钮。
--Tyler

我用这个:

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

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

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

然后,确保在viewWillAppear设置原始标题,如下所示:

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

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

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

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

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

在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];  
}

在viewDidLoad或loadView中添加以下代码

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

我用iOS 9在iPhone和iPad上测试过

我发现了一些有趣的东西。 如果您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这样的方法或类似的东西),这可以给出你在viewcontroller上的某些信息,你可以自定义它的后退按钮文本。 现在,后退按钮文本将在一个应该承担责任的地方进行处理。 我不得不承认创建一个新的按钮来改变文字糟透了,但是哦。

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

添加到缰绳的答案。 请注意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];

希望这可以帮助!

- (void)viewDidLoad {
  [super viewDidLoad];

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

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

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

扩展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

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

如果你想在swift 3中设置ARRIVING控制器中的标题(有时候更多逻辑..):

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

我知道这是一个老问题,答案有点不断更新!

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

即带你到下一个视图控制器的那个。

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

rein的答案很有效。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM