UINavigationController 隐藏导航栏单个视图控制器

3
我知道这是一个重复的问题。但是即使尝试了各种可能性,仍然存在问题。因此,我希望通过发帖来寻求解决方案。希望能从你们那里得到帮助。
初始视图嵌入在UINavigationController中。对于初始视图(着陆视图),导航栏必须隐藏。从着陆视图调用其他视图时,必须显示导航栏。
我通过覆盖视图的方法来处理着陆视图中导航栏的隐藏和显示,如下所示:
- (void)viewWillAppear:(BOOL)animated
{    
    [super viewWillAppear:animated];

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

// 即使尝试了animated:NO和animated:animated

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

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

}

当应用程序最初加载时,导航栏处于隐藏状态(按预期工作正常)。从子视图控制器返回到登陆界面时,几秒钟后导航栏被隐藏 - 登陆界面被加载到ui屏幕上。
我还尝试在landing view中使用navigationcontroller委托方法:navigationController:willShowViewController:animated:,但是无法找到需要的解决方案。
因此,我在其中一个子视图控制器中提供了navigationcontroller委托,并检查弹出的子控制器是否不在navigationcontroller的viewcontrollers中,使用if条件。当是的时候,我提供了navigationbar的隐藏选项。但是仍然没有达到解决方案。
在搜索过程中,有一种解决方案可以使用viewanimation来处理。我尝试了也失败了。
再次搜索,提供的解决方案是使用viewwillappear和viewwilldisappear来处理类似的问题。我很困惑,因为我的做法与建议的方法类似。即使这样,我仍然无法达到解决方案。
FYI..我正在使用Xcode 6.3,部署目标是从6.0开始的。我正在使用storyboard管理视图。
请帮助我解决这个问题... 应用程序加载时隐藏导航栏在登陆页面。但是当从子视图加载回登陆页面时,导航栏仅在登陆界面加载到控制器顶部后才会被隐藏。我确实需要像应用程序加载时一样隐藏导航栏,当子视图弹出并登陆视图加载到控制器的顶部时。

我认为你正在ViewWillAppear中编写代码,因此我认为问题发生了。因为这个方法在viewDidLoad之后被调用。 - Ashok Londhe
请尽量简洁明了地解释问题。 - Ashok Londhe
@M.SwornaVidhya,你试过vijeesh的回答了吗? - Ashok Londhe
@AshokLondhe,@BrittoThomas -- 我尝试使用[self.navigationController setNavigationBarHidden:YES],但它也失败了.. - M.Sworna Vidhya
@M.SwornaVidhya,你看过Vijeesh的答案了吗? - Ashok Londhe
显示剩余5条评论
3个回答

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里面,导航栏有时会被错误地隐藏。 - mariotaku

1
使用这个方法:

[navigationController setNavigationBarHidden:YES];

所以,如果您在某个视图控制器中:
[self.navigationController setNavigationBarHidden:YES];

更多澄清:

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

让我们看下面的层次结构:

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

每个UIViewController都将有导航栏,因为它们位于UINavigationController中。例如,您想要隐藏第二个(实际上无论在哪个视图控制器中都可以),那么请在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,请清楚地解释问题的确切情况。 - Ashok Londhe
@AshokLondhe,导航栏有时会在初始视图加载后隐藏。我需要它在初始视图加载到屏幕之前隐藏。我之前尝试过像_'vijeesh'_提到的方法,但也失败了。 - M.Sworna Vidhya
我认为你需要使用NSNotification并从ViewDidLoad中调用它。 - Ashok Londhe
我刚刚创建了一个示例,如果你想的话,我可以分享给你。 - vijeesh
@vijeesh,swornavidhya.ios@gmail.com。请分享样本。让我看看。 - M.Sworna Vidhya

0

在您的自定义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子类:例如MyNavigationControllerAppDelegate.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 ,但这是我在代码中执行的方式。

这里是另一个SO帖子,介绍如何创建用于故事板的自定义 UINavigationController


你是如何在UIViewController类中实现委托方法的?我无法理解你的方式...能否请你详细说明一下? - M.Sworna Vidhya
你需要创建自己的UINavigationController子类并在AppDelegate中使用它。 - Jasper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接