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

默认情况下,UINavigationController的“后退按钮”显示堆栈中最后一个视图的标题。是否有一种方法可以在后退按钮中自定义文本?

100489 次浏览

来自 这个链接:

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

正如泰勒在评论中所说:

不要在可见视图控制器中这样做,而是在视图中 控制器,如果您按下返回按钮

就会看到它

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

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

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

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

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

扩展 Aubrey 的建议,您可以在子视图控制器中完成以下操作:

创建两个变量来存储父节点的导航 Item.title 和父节点的导航项的旧值

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

并不完美。您将看到父视图的标题随着新控制器在。但这确实实现了自定义标签的后退按钮,并保持其形状像一个标准的后退按钮的目标。

我用这个:

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

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

苹果公司的文档中指出,项目的声明如下:

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

雷恩的回答很有效。

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

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

另外,确保按下 之前键推动视图控制器,否则在标题改变时会出现屏幕小问题。

后退按钮的标题默认为前一个视图的标题,因此我使用的一个快速技巧是将以下代码放置在前一个视图的标题上。M 档案。

-(void)viewWillAppear:(BOOL)animated {


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


-(void)viewWillDisappear:(BOOL)animated {


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

我发现了一些有趣的事。 如果您子类化了 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或类似的愚蠢的东西) ,它可以给你一些信息的视图控制器,这样你就可以定制它的后退按钮文本。现在,后退按钮的文本是照顾在一个地方,应承担的责任完全。我不得不承认,创建一个新按钮来更改文本很糟糕,但是好吧。

有人能想到不这样做的理由吗?至少你不必去摆弄视图控制器的标题,或者在按下导航控制器上的视图控制器之前记得创建一个新的返回按钮。

把这个放进你的 viewDidLoad里,希望它能达到你想要的效果

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

你可以在 Interface Builder 中设置文字:

选择 ViewController 的导航项,返回按钮将返回到:

enter image description here

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

enter image description here

我更喜欢这种方法而不是在代码中设置标题,就像在公认的答案中那样。

另请注意,您需要在视图控制器中执行此操作 换句话说,不要在可见视图控制器中这样做, 而是在视图控制器中,如果你点击后退按钮,你就会看到。
泰勒

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

在 viewDidLoad 或 loadView 中添加以下代码

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

我用 iOS9在 iPhone 和 iPad 上进行了测试

如果您想设置到达控制器的标题(有时更多的逻辑. .) 在雨燕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 放在一个控制器扩展中。

我知道这是一个老问题,而且答案有点过时了!

最简单的方法是在父 ViewController 中实现:

也就是带您到下一个视图控制器的那个。

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