如何从一个特定的视图控制器隐藏导航栏


71

我创建了两个启动屏幕iPhone应用程序。之后,将用户带到第一视图。我添加了一个UINavigationController。它工作得很好。

如何仅删除打开视图的导航栏?

主窗口

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


self.splashScreen = [[SplashScreen alloc] 
                initWithNibName:@"SplashScreen" 
                bundle:nil];
if (self.pageController == nil) {
openingpage *page=[[openingpage alloc]initWithNibName:@"openingpage" bundle:[NSBundle mainBundle]];
    self.pageController = page;
    [page release];
}
[self.navigationController pushViewController:self.pageController animated:YES];

[window addSubview:splashScreen.view];

 [splashScreen displayScreen];
[self.window makeKeyAndVisible];

return YES;
 }

Answers:


153

在视图控制器中尝试以下方法:

// swift
self.navigationController?.setNavigationBarHidden(true, animated: true)

// objective-c
[self.navigationController setNavigationBarHidden:YES animated:YES]; 

更多说明:

UINavigationController 有一个属性navigationBarHidden,可让您隐藏/显示整个导航控制器的导航栏。

让我们看下一个层次结构:

--UINavigationController
------UIViewController1
------UIViewController2
------UIViewController3

由于三个UIViewController都位于UINavigationController中,因此它们各自具有相同的导航栏。例如,您要隐藏UIViewController2的栏(实际上,哪一个都没关系),然后在UIViewController2中编写:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];   //it hides the bar
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES]; // it shows the bar back
}

1
尽管这提供了给出适当结果的答案,但打开的视图/初始屏幕不是导航控制器层次结构的一部分,因此不应真正位于导航控制器中。
twilson,2012年

2
我想要的是仅隐藏第一个“打开的视图”的导航栏。使用以上内容隐藏与第一个视图控制器相关的文件的整个导航栏
kingston 2012年

@kingston,然后[self.navigationController setNavigationBarHidden:NO];在viewWillDisappear中再次显示它:)
beryllium

@berylliyum:我的打开页面是一个表格view.ive集合[self.navigationController setNavigationBarHidden:YES];这隐藏了该特定表格视图的导航栏,并且在我的表格视图中也隐藏了导航视图,说“ mapview”。所以我使用了[self .navigationController setNavigationBarHidden:NO];在我的“ MapView” viewDidLoad中,我能够获取导航栏。但是如果我再次导航回包含表格view.im的打开视图,则再次获取导航栏的任何想法。 ü可以helpe我出了这
金士顿

4
还有一种- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated方法可以显示/隐藏带有视图动画的导航栏。这个答案使我明白了这一点。谢谢。
Martin Berger 2013年

23

斯威夫特4:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    navigationController?.setNavigationBarHidden(true, animated: true)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    navigationController?.setNavigationBarHidden(false, animated: false)
}

您能否详细说明答案?仅发布代码通常不是很有帮助。
Noel Widmer

这很好,因为在离开当前视图控制器之后,它将显示其余视图控制器的导航栏。谢谢!
CapturedTree '18

5

这为我工作:

斯威夫特4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: false)
}

//reappears navigation bar on next page
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: true)
}

1

在一行代码下面使用以下代码隐藏Swift3和Swift4中的导航栏

navigationController?.setNavigationBarHidden(true, animated: true)

显示导航栏

navigationController?.setNavigationBarHidden(false, animated: true)

1

最好记住它是否以前被隐藏了:

private var navigationBarWasHidden = false

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Save if it was hidden initially
    self.navigationBarWasHidden = self.navigationController?.isNavigationBarHidden ?? false
    // Hide the Navigation Bar
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Show the Navigation Bar
    self.navigationController?.setNavigationBarHidden(self.navigationBarWasHidden, animated: animated)
}


-2

模态显示打开视图,或者;

  1. 不要将其添加到导航控制器
  2. 在导航控制器之前展示它。
  3. 加载完所有内容后,关闭打开的视图并显示导航控制器(均不包含动画)。

从此线程中举一个例子:如何在iPhone上显示启动屏幕更长的时间?

-(void)applicationDidFinishLaunching:(UIApplication *)application {
    [window addSubview:splashView];
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
                                 toTarget:self withObject:nil];
}

-(void)getInitialData:(id)obj {
    [NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response
    [splashView removeFromSuperview];
    [window addSubview:tabBarController.view];
}

OP并不意味着如何显示更长时间的启动屏幕,而问题根本不是关于启动。
beryllium 2012年

@berryllium也许他不是那个意思,但是他说“两个闪屏iPhone应用程序”,这就是他得到的有关“闪屏”的答案。问题中未表达用户交互。
twilson,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.