12

我有一个 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。我该如何解决这个问题?

4

8 回答 8

15

更新
4.2 中的一个可能的错误,因为它工作到 4.1 sdks

我已经尝试过了,我的工作正常。我只是发布了 B 视图控制器 (BVC) 和 C 视图控制器 (CVC) 的实现。我最初的猜测是您没有在viewDidLoad.

@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
于 2011-02-21T06:11:51.940 回答
7

我认为您必须在推送或弹出视图控制器以影响下一个视图控制器之前设置该属性,为 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时“不”)。

于 2011-02-21T05:45:20.223 回答
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 中消失了。

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

于 2011-03-10T04:42:15.443 回答
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];
}
于 2011-02-26T18:23:45.163 回答
0

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

重新编辑:

试试这个,它对我有用:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    self.navigationItem.hidesBackButton = NO;
}
于 2011-02-25T21:33:01.650 回答
0

使用 UINavigationControllerDelegate 方法-navigationController:willShowViewController:animated:。您将在视图控制器 A 和视图控制器 B 中实现这一点。在 A 中,您将设置-hidesBackButton:YESNO在视图控制器 B 中设置。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.hidesBackButton = YES;
}
于 2011-03-01T02:37:35.557 回答
0

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

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

- (void) viewWillDisappear:(BOOL)animated{
    self.navigationItem.hidesBackButton = NO;
}
于 2011-03-01T17:46:01.920 回答
0

如果您的视图层次结构确实是视图 B 不应该显示后退按钮但视图 C应该显示,那么解决此问题的最简单方法是重构您的层次结构。我正在考虑以下替代方案:

视图 A 调用presentModalViewController:animated:视图 B*,UINavigationControllerview属性为视图 B。视图 B* 将视图 C 推送到其导航堆栈以响应来自视图 B 的事件(或其他事件)。如果您需要快速跳回视图 A,则调用dismissModalViewControllerAnimated:在视图 A 上。如果您想将视图 B* 和 C 的状态保留在内存中,那么您还可以在某处保留另一个指向视图 B* 的指针,这样它就不会在关闭时消失。

于 2011-03-02T01:39:13.507 回答