UINavigationController:在一个视图上隐藏后退按钮隐藏所有视图

时间:2011-02-21 04:47:05

标签: iphone objective-c cocoa-touch uinavigationcontroller uinavigationitem

我有一个UINavigationController,它在堆栈中包含3个UIViewControllers。

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;`

即使我将hidesBackButton设置为NO,View C也不会显示后退按钮。我该如何解决这个问题?

9 个答案:

答案 0 :(得分:15)

<强>更新
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 :(得分:8)

我认为你必须在推送或弹出视图控制器之前设置属性以影响下一个视图控制器,在viewWillAppear中为当前viewcontroller设置它为时已晚。

编辑:这看起来像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那里时)设置为“NO”)。

答案 2 :(得分:6)

这是我在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中消失。

注意:即使错误似乎已修复,我更喜欢“空视图”技术,因为它允许后退按钮的消失和再现动画。

答案 3 :(得分:1)

解决这个问题的方法有点棘手。只要我遇到同样的问题,就一定要试一试。

首先在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];
}

答案 4 :(得分:0)

当您返回时(不管您是在做什么),请将hidesBackButton属性重置为YES。例如,在viewWillAppear:方法中,执行类似

的操作
@implementation SomeViewController

- (void) viewWillAppear:(BOOL)animated {
    self.navigationController.navigationItem.hidesBackButton = YES;
    [super viewWillAppear:animated];
}

@end

我认为它就像那样简单,但我可能错了。毕竟,导航项由UINavigationController拥有,因此根据UINavigationController的堆栈中的UIViewController,对它进行的更改将不会被保存/恢复。

答案 5 :(得分:0)

我正在运行相同的问题而且它只发生在iOS 4.2模拟器上,所以可能是该版本的错误。

重新编辑:

试试这个,它对我有用:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    self.navigationItem.hidesBackButton = NO;
}

答案 6 :(得分:0)

使用UINavigationControllerDelegate方法-navigationController:willShowViewController:animated:。您将在视图控制器A和视图控制器B中实现此功能。在A中,您将-hidesBackButton:设置为YES,并在视图控制器B中设置为NO

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.hidesBackButton = YES;
}

答案 7 :(得分:0)

您还可以使用以下示例代码;

- (void) viewWillAppear:(BOOL)animated{
    self.navigationItem.hidesBackButton = YES;
}

- (void) viewWillDisappear:(BOOL)animated{
    self.navigationItem.hidesBackButton = NO;
}

答案 8 :(得分:0)

如果您的视图heirarchy真的是这样,View B应该显示后退按钮但View C 应该,那么最简单的解决方法就是重构你的层次结构。我正在考虑以下替代方案:

在视图B *上查看调用presentModalViewController:animated:UINavigationControllerview属性为视图B.视图B *将视图C推送到其导航堆栈以响应事件(或否则)从视图B.如果你需要跳回 快速查看A然后在视图A上调用dismissModalViewControllerAnimated:。如果要将View B *和C的状态保持在内存中,那么您还可以在某处保留另一个指向View B *的指针,以便在解除时不会消失