UINavigationController“后退button”自定义文本?
默认情况下,“后退button”显示堆栈中最后一个视图的标题,是否有方法可以在后退button中使用自定义文本?
从这个链接 :
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Custom Title" style:UIBarButtonItemStylePlain target:nil action:nil];
正如泰勒在评论中所言:
不要在可见视图控制器中这样做,而是在视图控制器中,如果你点击后退button,你会看到
您可以在Interface Builder中设置文本:
select后退button将返回到的ViewController的导航项目:
在“实用程序”面板属性检查器中,为“后退”buttoninput标签:
我更喜欢这种方法,在接受的答案中设置标题的代码。
另外请注意,您需要在视图控制器的堆叠中的一级上执行此操作。 换句话说,不要在可见视图控制器中这样做,而是在视图控制器中,如果您点击后退button,就会看到这个控制器。
–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"; }
我发现一个方便的解决scheme,只需设置控制器的标题,然后再推入另一个控制器,如下所示:
self.navigationItem.title = @"Replacement Title"; [self.navigationController pushViewController:newCtrl animated:YES];
然后,确保在viewWillAppear
设置原始标题,如下所示:
-(void)viewWillAppear:(BOOL)animated { ... self.navigationItem.title = @"Original Title"; ... }
这是可行的,因为在推送操作期间构build后退button时, UINavigationController
的默认行为是使用前一个控制器中的标题。
后退button的标题默认为前一个视图的标题,所以我使用的一个快速技巧是将以下代码放在前一个视图的.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]; }
加上缰绳的答案。 请注意苹果的文档, 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
或者你可以在实例中指定一个variables,以便以后可以明确地释放它:
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]; }
我发现了一些有趣的东西。 如果你inheritance了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
将自动具有“返回”button。 如果你想改变某些视图控制器的文本,你可以试着将视图控制器转换成一个特定的类或者你自己的自定义协议(你的视图控制器inheritance自其中的一个方法,像backButtonText
或类似的东西)你在视图控制器的某些信息即将到来,您可以自定义后退button文本。 现在后退button文本在应该单独承担责任的地方照顾。 我不得不承认,创build一个新的button来改变文本糟透了,但哦。
任何人都可以想到为什么不这样做的原因? 至less你不必小看viewcontroller标题,或者必须记住在推动导航控制器上的viewcontroller之前创build一个新的后退button。
在viewDidLoad或loadView中添加下面的代码
self.navigationController.navigationBar.topItem.title = @"Custom text";
我使用iOS 9在iPhone和iPad上testing了它
缰绳的答案效果很好。
请注意,如果您推送多个视图控制器,则会为每个视图控制器显示更改的后退button标题,这可能不是您想要的。
在这种情况下,每次按下视图控制器时都需要创build自定义的UIBarButtonItem。
另外,请确保在按下视图控制器之前执行此操作,否则在标题更改时会出现屏幕呃逆。
扩展奥布里的build议,你可以在子视图控制器中做到这一点:
创build两个variables来存储父级的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
这并不完美。 当新的控制器被animation时,你会看到父视图改变的标题。但是这样做的目的是自定义后退button的标签并保持它像一个标准的后退button。
把它放到你的viewDidLoad
,希望它会导致你正在寻找的东西
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backBarButtonItem; [backBarButtonItem release];
如果你想快速的在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放在一个控制器扩展中。
在代码中执行此操作将删除UINavigationConroller
的后退button样式。 如果您在每个视图中添加导航条目,则可以在StoryBoard
设置后面的标题。