【问题标题】:UINavigationController hide nav bar for single viewcontrollerUINavigationController 隐藏单个视图控制器的导航栏
【发布时间】:2015-07-17 14:53:02
【问题描述】:

我知道它是重复的。但是仍然有问题,即使尝试了可能性也没有奏效。因此发布相同的解决方案。希望能得到大家的帮助。

初始嵌入在 UINavigationController 中。对于初始(着陆视图),必须隐藏导航栏。从着陆视图调用其他视图时 - 必须显示导航栏。

我正在通过覆盖视图的方法来处理登陆视图中导航栏的隐藏和显示,如下所示:

- (void)viewWillAppear:(BOOL)animated
{    
    [super viewWillAppear:animated];

    // Hiding the navigationbar hidden for the first page
    [[self navigationController] setNavigationBarHidden:YES animated:YES];
}

// 甚至尝试过动画:NO & 动画:动画

- (void)viewDidDisappear:(BOOL)animated
{    
    [super viewDidDisappear:animated];

    // Showing the navigationbar hidden for the first page
    [[self navigationController] setNavigationBarHidden:NO animated:YES];

}

当应用程序最初加载时,导航栏处于隐藏状态(如预期和工作正常)。当从子视图控制器返回到着陆视图时,导航栏会在几秒钟后隐藏 - 着陆视图会加载到 ui 屏幕上。

我还尝试在登陆视图中使用导航控制器委托方法:navigationController: willShowViewController: animated:。但无法达到我需要的解决方案。

因此,我在我的一个子视图控制器中提供了导航控制器委托,并使用 if 条件检查了弹出时子控制器是否不在导航控制器的视图控制器中。如果是,那么我提供了导航栏的隐藏选项。但也没有解决办法。

在冲浪期间,有一个处理视图动画的解决方案。我试过了,也失败了。

再次浏览,提供的解决方案是处理 viewwillappear 和 viewwilldisappear 的类似问题。我眨了眨眼,因为我正在做的方式与建议的方式相似。即便如此,也无法达成解决方案。

仅供参考。我使用的是 Xcode 6.3,部署目标是 6.0 以后。我正在使用故事板来管理视图。

请帮我解决问题...App loads is hiding the nav bar in landing page. But when landing page is loaded back from a child view then the nav bar gets hidden only after the landing page loaded on to the ui. I do need to get hidden of the nav bar as like when app loads, when the child view pops and the landing view gets loaded on the top of the controller.

【问题讨论】:

  • 我认为您正在 ViewWillAppear 中编写代码.. 因为它我认为问题发生了。因为这个方法在 viewDidLoad 之后被调用。
  • 试着正确而简短地解释问题。
  • @AshokLondhe,在“请帮我解决问题...”之后简要介绍的最后几行是我的问题。
  • [[self navigationController] setNavigationBarHidden:NO animated:YES]; 放入viewWillDisappear: 而不是viewDidDisappear
  • @M.SwornaVidhya 你试过vijeesh回答吗。

标签: ios objective-c uinavigationcontroller storyboard uinavigationbar


【解决方案1】:

使用这个方法:

[navigationController setNavigationBarHidden:YES];

所以,如果你在某个视图控制器中:

[self.navigationController setNavigationBarHidden:YES];

更多说明:

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

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

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

三个 UIViewController 中的每一个都将具有导航栏,因为它们位于 UINavigationController 中。比如你想把bar隐藏到第二个(其实在哪一个都无所谓),然后写入UIViewController2:

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

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

【讨论】:

  • @M.SwornaVidhya 清楚地解释确切的问题是什么。
  • @AshokLondhe,导航栏在初始视图加载后隐藏了一段时间。我确实需要在初始视图加载到屏幕之前隐藏它。我之前尝试过 'vijeesh' 提到的方法,但也失败了。
  • 为此,我认为您需要使用 NSNotification 并从 ViewDidLoad 调用它。
  • 我刚刚创建了样本,如果你愿意,我可以分享给你
  • @vijeesh, swornavidhya.ios@gmail.com.. 请分享示例。让我看看。
【解决方案2】:

如果您想在第二个视图中隐藏导航栏,请不要尝试在 viewWillAppear 和 viewWillDisappear 中进行管理,因为我通过这样的尝试遇到了很多问题,并且它也影响了约束。只需在 appDelegate 中使用代理作为导航控制器就可以了。

self.navigationController.delegate = self;

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        if ([viewController isKindOfClass:[LoginViewController class]])
     {
            [self.navigationController setNavigationBarHidden:YES animated:animated];
        } else {
            [self.navigationController setNavigationBarHidden:NO animated:animated];
        }
    }

【讨论】:

  • 这个答案真的很有帮助。它可以防止许多错误,尤其是当您在 UITabBarController 中使用时。如果你把隐藏逻辑放在每个 VC 里面,NavBar 有时会隐藏不正确。
【解决方案3】:

在您的自定义UINavigationController 类中覆盖委托方法:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self setNavigationBarHidden:NO];
    if ([viewController isKindOfClass:[SomeViewController class]])
    {
        [self setNavigationBarHidden:YES];
    }
}

将其放入您的 UINavigationController 类的一个好处是您不会在您的 UIViewController 类中使用代码

经过测试并且有效。

更新

创建一个UINavigationController 子类:f.e. MyNavigationController

AppDelegate.h:

#import "MyNavigationController.h"

@property (nonatomic) MyNavigationController *navigationController;

然后在AppDelegate.m中初始化:

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

    //Probably some more code here

    self.navigationController = [[MyNavigationController alloc] initWithRootViewController:yourRootViewController];
    self.window.rootViewController = self.navigationController;

    self.window.backgroundColor = [UIColor blackColor];
    [self.window makeKeyAndVisible];

    return YES;
}

然后在您的自定义UINavigationController 类中覆盖委托方法

我对故事板几乎没有经验,所以不太确定如何设置自定义 UINavigationController,但这是我在代码中的做法。

Here's 另一个 SO 帖子如何创建自定义 UINavigationController 以用于情节提要。

【讨论】:

  • 你是如何在 uiviewcontroller 类中实现委托方法的。我无法理解你的方式..请你详细说明一下。
  • 您需要创建自己的 UINavigationController 子类并在您的 AppDelegate 中使用它
猜你喜欢
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多