Answers:
从此链接:
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
正如泰勒在评论中所说:
不要在可见的视图控制器中执行此操作,而是在视图控制器中单击后退按钮
release
的UIBarButtonItem
。
UIBarButtonItemStyleBordered
为对property的调用self.navigationItem.backBarButtonItem.style
。文档:developer.apple.com/library/ios/documentation/uikit/reference/...
您可以在“界面生成器”中设置文本:
选择后退按钮将返回的ViewController导航项:
在实用程序面板属性检查器中,为“后退按钮”输入标签:
与在接受的答案中那样在代码中设置标题相比,我更喜欢这种方法。
还要注意,您需要在视图控制器中向上一级进行此操作。换句话说,不要在可见的视图控制器中执行此操作,而要在视图控制器中执行以下操作:单击后退按钮。
-泰勒
我用这个:
// 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;
}
然后添加一个简单的方法,以允许视图控制器关闭:
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
在viewDidLoad或loadView中添加以下代码
self.navigationController.navigationBar.topItem.title = @"Custom text";
我在iOS 9的iPhone和iPad上进行了测试
navigationController
和topItem
属性上的可选链接,例如:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
添加到控制的答案。从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];
希望这可以帮助!
我发现了一些有趣的东西。如果您将子类化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标题,也不必记住在按下导航控制器上的ViewController之前创建一个新的后退按钮。
扩展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
这不是完美的。随着新控制器的动画效果,您将看到父视图的标题发生变化。但这确实达到了自定义标记后退按钮并使其形状像标准后退按钮的目的。
把它放到你身上viewDidLoad
,希望它会变成你想要的东西
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
如果要在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放在控制器扩展中。
self.navigationController.navigationBar.topItem.title = @"Custom text";