9

我有这个问题:我有一个视图控制器(嵌入在导航控制器中),在执行操作后会触发手动 segue 推送新视图控制器,但是在新视图控制器中没有导航栏,因为在第一个控制器中我有像这样实现 viewWillDisappear 方法:

开始视图控制器

- (void)viewWillDisappear:(BOOL)animated {
  // Hide the navigation bar just before the view disappear
  [[self navigationController] setNavigationBarHidden:YES animated:YES];
}

这是IBAction中的手动 segue 的代码:

[self performSegueWithIdentifier:@"tutorialSegue" sender:self];

目的地视图控制器

我试过这样

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.
    [[self navigationController] setNavigationBarHidden:NO animated:NO];
}

但它不起作用,实际上在调试器中我注意到navigationcontroller 等于nil,我就是不知道为什么。

4

4 回答 4

11

如果您希望 StartViewController 隐藏导航栏,而 DestinationViewController 显示它:在-(void)viewWillAppear:方法中添加相应的代码。

开始视图控制器:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:YES animated:YES];
}

目的地视图控制器:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:NO animated:YES];
}

如果您希望两个视图控制器都有导航栏,只需删除包含的所有行setNavigationBarHidden:

于 2013-10-15T11:34:12.480 回答
1

你的问题是viewDidLoad你的viewWillDisappear. 您必须先加载新视图,然后才能卸载父视图(视觉上)。因此,您将导航栏设置为可见并再次隐藏它。

导航栏在嵌套在其中的视图之间是通用的。当视图消失时,真的没有理由隐藏它,除非子视图视图不需要它。如果您进一步解释了您正在尝试做的事情,我们可以提供更多帮助。但与此同时,如果您只是删除您的viewWillDisappear实现(至少您向我们展示的内容),您应该会很好。否则,您可以将 hidden 属性设置为noDestinationViewController 的viewWillAppearviewDidAppear(取决于调用顺序)。

于 2013-10-15T11:37:53.160 回答
0

只是另一个角度:在故事板编辑器中,我意外地重置了初始视图控制器(在属性窗格中),结果我丢失了导航栏。只需将导航控制器重置为“是初始视图控制器”即可将其恢复。

于 2015-06-18T10:01:22.923 回答
0

如果您的代码看起来像

-(void)viewWillAppear:(BOOL)animated
{
   [self.navigationController setNavigationBarHidden:NO];
   [super viewWillAppear:YES];
}

将其更改为,

-(void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:YES];
   [self.navigationController setNavigationBarHidden:NO];
}

在“self.nav ...”之前键入“super viewWillappear ...”

于 2017-06-27T13:34:42.340 回答