UINavigationController:在一个视图上隐藏后退按钮为所有视图隐藏它
Posted
技术标签:
【中文标题】UINavigationController:在一个视图上隐藏后退按钮为所有视图隐藏它【英文标题】:UINavigationController: Hiding Back Button on One View Hides it For All Views 【发布时间】:2011-02-21 04:47:05 【问题描述】:我有一个 UINavigationController,它在堆栈上包含 3 个 UIViewController。
View A - is the root
View B - is pushed by View A and has `self.navigationItem.hidesBackButton = YES;`
View C - is pushed by View B and has `self.navigationItem.hidesBackButton = NO;`
视图 C 不显示后退按钮,即使我将 hidesBackButton 设置为 NO。我该如何解决这个问题?
【问题讨论】:
可以告诉B视图的标题吗? 视图 B - self.title = @"Deals" \阿拉姆,你应该尝试向苹果提交错误,或者干脆给他们发邮件寻求支持。 【参考方案1】:更新4.2 中的一个可能的错误,因为它一直工作到 4.1 sdks
我已经尝试过了,我的工作正常。我只是发布了 B 视图控制器 (BVC) 和 C 视图控制器 (CVC) 的实现。我最初的猜测是你没有在viewDidLoad
中设置 BVC 的标题。
@implementation BVC
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
[super viewDidLoad];
self.navigationItem.title = @"I am B";
- (void) viewWillAppear:(BOOL)animated
self.navigationItem.hidesBackButton = YES;
- (IBAction)pushB:(UIButton *)sender
CVC *cvc = [[CVC alloc] initWithNibName:@"CVC" bundle:nil];
[self.navigationController pushViewController:cvc animated:YES];
[cvc release];
@end
@implementation CVC
- (void) viewWillAppear:(BOOL)animated
self.navigationItem.hidesBackButton = NO;
@end
【讨论】:
+1,它帮助了我,但实际上我必须为我的所有视图隐藏它,但我无法做到。我在每个视图中都写了这个:(【参考方案2】:我认为您必须在 推送或弹出视图控制器以影响下一个视图控制器之前设置该属性,为 viewWillAppear 中的当前视图控制器设置它为时已晚。
编辑:这看起来像 4.2 中的错误!后退按钮在 4.2 模拟器和 4.2 设备上都保持隐藏状态,但在 3.2、4.1 和 4.0 模拟器中都可以使用!
这是使用隐藏后退按钮按下 VC 时的代码:
- (IBAction) goto2nd
SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease];
vc.navigationItem.hidesBackButton = YES;
[self.navigationController pushViewController:vc animated:YES];
这就是所需要的,每个 VC 都有自己的 navigationItem,它不是全局设置,所以你不需要费心撤消它来恢复后退按钮(至少在弹出回到它所在的 VC 时)设置为“否”)。
【讨论】:
还是没有运气。在推之前尝试viewB.navigationItem.hidesBackButton = YES
,在推之前尝试viewC.navigationItem.hidesBackButton = NO
,但没有运气。s
好的,我看到了同样的东西——很奇怪,正在研究它
我确认了这个错误。 4.2 Sim 隐藏了后退按钮,但我的 4.0 设备显示正常。【参考方案3】:
这是我在 4.3 上成功使用的解决方法。
不是隐藏后退按钮,而是将左栏按钮视图设置为空视图:
UIView *tmpView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *tmpButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tmpView];
[tmpView release];
self.navigationItem.leftBarButtonItem = tmpButtonItem;
[tmpButtonItem release];
要恢复后退按钮,只需将左栏按钮项设置为nil
:
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
更新:似乎该错误在 4.3 中消失了。
注意:尽管该错误似乎已修复,但我更喜欢“空视图”技术,因为它允许后退按钮的消失和重新出现动画。
【讨论】:
这种做法完全去掉了[这个问题的解决方案有点棘手..只要试试它肯定会工作,因为即使我也遇到了同样的问题。
首先在viewWillAppear
中设置导航标题。
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
self.navigationItem.title = @"SET YOUR TITLE";
当您导航到其他页面时,只需将导航标题设置为 null。这不会在顶部显示任何按钮。因为您可以摆脱写作
self.navigationItem.hidesBackButton = YES;
每次。
- (IBAction)pushB:(UIButton *)sender
SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease];
self.navigationItem.title = @"";
[self.navigationController pushViewController:vc animated:YES];
[vc release];
【讨论】:
【参考方案5】:我正在运行同样的问题,而且它只发生在 ios 4.2 模拟器上,所以可能是那个版本的错误。
重新编辑:
试试这个,它对我有用:
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
self.navigationItem.hidesBackButton = NO;
【讨论】:
【参考方案6】:使用 UINavigationControllerDelegate 方法-navigationController:willShowViewController:animated:
。您将在视图控制器 A 和视图控制器 B 中实现这一点。在 A 中,您将在视图控制器 B 中将 -hidesBackButton:
设置为 YES
,或者设置为 NO
。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
viewController.hidesBackButton = YES;
【讨论】:
【参考方案7】:您也可以使用以下示例代码;
- (void) viewWillAppear:(BOOL)animated
self.navigationItem.hidesBackButton = YES;
- (void) viewWillDisappear:(BOOL)animated
self.navigationItem.hidesBackButton = NO;
【讨论】:
【参考方案8】:如果您的视图层次结构确实是视图 B 应该不显示后退按钮但视图 C 应该,那么解决此问题的最简单方法是重构您的等级制度。我正在考虑以下替代方案:
视图 A 在视图 B* 上调用 presentModalViewController:animated:
,UINavigationController
其 view
属性是视图 B。视图 B* 将视图 C 推送到其导航堆栈以响应来自视图 B 的事件(或其他事件)。如果您需要跳回
快速查看 A,然后在视图 A 上调用 dismissModalViewControllerAnimated:
。如果您想将视图 B* 和 C 的状态保留在内存中,那么您还可以在某处保留另一个指向视图 B* 的指针,这样它在关闭时不会消失。
【讨论】:
以上是关于UINavigationController:在一个视图上隐藏后退按钮为所有视图隐藏它的主要内容,如果未能解决你的问题,请参考以下文章
关闭 UINavigationController 并呈现另一个 UINavigationController
iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?
带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller
带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController
在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?
UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr