【问题标题】:How to hide a navigation bar from one particular view controller如何从一个特定的视图控制器中隐藏导航栏
【发布时间】:2012-02-11 09:14:53
【问题描述】:

我创建了一个两个启动屏幕的 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;
 }

【问题讨论】:

    标签: ios cocoa-touch


    【解决方案1】:

    在视图控制器中试试这个方法:

    // swift
    self.navigationController?.setNavigationBarHidden(true, animated: true)
    
    // objective-c
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    

    更多说明:

    UINavigationController 有一个属性navigationBarHidden,它允许你隐藏/显示整个导航控制器的导航栏。

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

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

    三个 UIViewController 中的每一个都具有相同的导航栏,因为它们位于 UINavigationController 中。比如你想隐藏 UIViewController2 的 bar(其实在哪一个都没有关系),然后在你的 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
    }
    

    【讨论】:

    • 虽然这提供了一个给出足够结果的答案,但打开的视图/启动屏幕不是导航控制器层次结构的一部分,因此不应该真正在导航控制器中。
    • 我想要的是仅隐藏第一个“打开视图”的导航栏。使用上述隐藏与第一个视图控制器相关的文件的整个导航栏
    • @kingston,然后在 viewWillDisappear 中再次显示[self.navigationController setNavigationBarHidden:NO]; :)
    • @berylliyum:我的打开页面是一个表格视图。我设置了 [self.navigationController setNavigationBarHidden:YES];这隐藏了该特定表格视图的导航栏以及我的表格视图中的导航视图说“ mapview”。所以我使用了 [self.navigationController setNavigationBarHidden:NO];在我的“MapView”viewDidLoad 中,我能够获得导航栏。但是如果我再次导航回包含表格视图的打开视图。我再次获得导航栏任何想法..如果你能帮我解决这个问题,我会非常感激
    • 还有- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated 方法可以显示/隐藏带有视图动画的导航栏。这个答案让我明白了。谢谢。
    【解决方案2】:

    斯威夫特 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)
    }
    

    【讨论】:

    • 你能详细说明你的答案吗?仅发布代码通常不是很有帮助。
    • 这很好,因为它会在您离开当前视图控制器后显示其余视图控制器的导航栏:)。谢谢!
    【解决方案3】:

    这对我有用:

    斯威夫特 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)
    }
    

    【讨论】:

      【解决方案4】:

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

      navigationController?.setNavigationBarHidden(true, animated: true)
      

      显示导航栏

      navigationController?.setNavigationBarHidden(false, animated: true)
      

      【讨论】:

        【解决方案5】:

        在 c# 或 Xamarin.IOS 中, this.NavigationController.NavigationBar.Hidden = true;

        【讨论】:

          【解决方案6】:

          如果之前被隐藏,最好记住:

          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)
          }
          

          【讨论】:

            【解决方案7】:

            您可以尝试像这样直接将导航栏隐藏到相关的 UIViewController

            override func viewWillAppear(_ animated: Bool) {
                self.navigationController?.navigationBar.isHidden = true
                super.viewWillAppear(animated)
            }
            
            override func viewWillDisappear(_ animated: Bool) {
                self.navigationController?.navigationBar.isHidden = false
                super.viewWillDisappear(animated)
            }
            

            【讨论】:

              【解决方案8】:

              模态显示打开视图,或;

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

              以这个帖子为例:How can I display a splash screen for longer on an 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 并不是说​​如何让闪屏显示得更久,问题根本不是关于闪屏的。
              • @berryllium 也许他不是那个意思,但他说的是“一个有两个闪屏的 iPhone 应用程序”,所以这就是他得到的关于“闪屏”的答案。问题中未表达任何用户交互。
              猜你喜欢
              • 1970-01-01
              • 2018-04-19
              • 2015-07-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-16
              • 2017-02-11
              • 1970-01-01
              相关资源
              最近更新 更多