【问题标题】:UINavigationController: Hiding Back Button on One View Hides it For All ViewsUINavigationController:在一个视图上隐藏后退按钮为所有视图隐藏它
【发布时间】: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"
  • \阿拉姆,你应该尝试向苹果提交错误,或者干脆给他们发邮件寻求支持。

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


【解决方案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* 的指针,这样它在关闭时不会消失。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-17
            • 2010-10-09
            • 2011-03-22
            • 1970-01-01
            • 1970-01-01
            • 2012-10-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多