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 中消失了。

注意:尽管该错误似乎已修复,但我更喜欢“空视图”技术,因为它允许后退按钮的消失和重新出现动画。

【讨论】:

这种做法完全去掉了[【参考方案4】:

这个问题的解决方案有点棘手..只要试试它肯定会工作,因为即使我也遇到了同样的问题。

首先在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:UINavigationControllerview 属性是视图 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