UINavigationController“后退按钮”自定义文本?
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
正如泰勒在评论中说:
不可见视图控制器做到这一点,但在视图 控制器,你会看到如果你点击后退按钮
你应该释放'UIBarButtonItem'。 – 2009-09-17 22:53:27
另外请注意,您需要在视图控制器的堆叠中的一级上执行此操作。换句话说,不要在可见视图控制器中这样做,而是在视图控制器中,如果你点击后退按钮,你会看到它。 – Tyler 2009-09-17 23:07:03
非常感谢泰勒。你的评论为我节省了很多时间! – 2011-04-15 20:14:25
我发现了一个方便的解决方案通过简单的设置推另一个控制器到堆栈,这样之前控制器的标题:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
然后,确保设置原稿标题viewWillAppear
,像这样:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
这因为在推送操作期间构建后退按钮时,UINavigationController
的默认行为是使用前一个控制器中的标题。
扩展在奥布里的建议,你可以在子视图控制器做到这一点:
在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
这并不完美。当新的控制器被动画时,您会看到父视图更改的标题。但是,这确实实现了自定义标记后退按钮并将其保持为标准后退按钮的目标。
我用这个:
// 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];
}
加入缰绳的答案。从苹果公司的文档需要注意的是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];
希望这有助于!
现在注意,使用ARC,您不必担心autorelease(如果您尝试在启用ARC的项目中尝试自动释放,编译器会发生错误) – 2012-08-22 23:58:57
- (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
[email protected]"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
[email protected]"Back";
}
这很有效对于很多情况,这很简单...只有观察到覆盖这些方法中的任何一个都需要在新方法的某个时刻调用super的实现。 – izk 2012-12-19 01:31:31
使用这种方法,人们会注意到在推动动画发生之前,父视图的标题被改为“后退”。 (而且,很糟糕的是,如果你把它移动到viewDidDisappear方法中,你会看到开关在推后发生..) – 2013-01-15 12:40:44
我喜欢这种方法,但我面对的这个问题是,“原始标题”被设置好吧,但如果长度比“返回”长,它会附带省略号,因为视图不在视图层次结构中,因此它不会重新放置标题视图。由于动画的初始速度很快,上述@JamesBoutcher描述的问题对我来说并不明显。事实上,我刚刚意识到我面临的问题尤其值得注意,因为这个问题突出时,结束动画缓慢。 – trss 2014-01-24 17:13:11
我发现了一些有趣的东西。 如果子类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之前创建一个新的后退按钮。
将这个变成你viewDidLoad
,希望这将导致到你正在寻找
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
你可以设置在界面生成器的文本:
选择视图控制器的导航项目的后退按钮将返回:
在公用事业面板属性inspecto R,输入你的标签的后退按钮:
我宁愿这种做法在设置代码中的标题为接受的答案。
另外请注意,您需要在视图控制器上层 堆栈中执行此操作。换句话说,不要在可见视图控制器 中执行此操作,但在视图控制器中,如果您点击后退按钮,则会看到该控制器。
--Tyler
这是迄今为止发现的最佳答案。 – 2014-03-08 21:15:22
要清楚,这需要在视图控制器的导航项上设置,而不是在视图控制器的属性检查器本身上。 – 2014-04-21 14:39:41
这是我找到的最佳答案。 – bicepjai 2014-04-27 01:13:42
代码实现这一点删除UINavigationConroller
的后退按钮样式。如果您在每个视图中添加导航项目,则可以在StoryBoard
中设置后端乐章的标题。
添加以下代码在viewDidLoad中或的loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
我与iOS 9
测试了它的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放在控制器扩展中。
这个工作对我来说'self.navigationController.navigationBar.topItem.title = @“Custom text”;' – huync 2017-08-31 06:04:42