为啥我的 UINavigationbar 被隐藏了?

Posted

技术标签:

【中文标题】为啥我的 UINavigationbar 被隐藏了?【英文标题】:why my UINavigationbar is hidden?为什么我的 UINavigationbar 被隐藏了? 【发布时间】:2014-09-24 07:54:01 【问题描述】:

我正在开发一个 ios 应用程序。 我的问题是在我的故事板上我有一个显示的导航栏,但是当我运行应用程序时,它是隐藏的,我不知道为什么....

首先我有一个“StartViewController”来加载数据并显示 MainViewController,我这样做:

 - (void)finishDownloadDataWithError:(NSError *)error
//si il ya pas eu d'erreur on arrête la video et on éxecute loadMainView.
if (error == nil) 
    NSLog(@"download OK");

    //simule un téléchargeemnt de 3s
    //[NSThread sleepForTimeInterval:2.f];
    _loadingIndicator.hidden = YES;



//si il ya eu des erreur on affiche la popup d'erreur.
else 
    NSLog(@"download fail");



//on utilise ce booléen pour être sur de ne créer qu'une seul fois les instances des controllers
static BOOL firstTime = YES;
if (firstTime) 
    firstTime = NO;

    //chargement de la vue suivante
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    MainViewController * controller = (MainViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
    [self presentViewController:controller animated:YES completion:nil];

  


这是我的 MainViewController

  - (void)viewWillAppear:(BOOL)animated


self.navigationBar.title = @"FoodStash";
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.tintColor = [UIColor blueColor];
[self.navigationController setNavigationBarHidden:NO animated:NO];

这是我的故事板:

这是没有我的导航栏的模拟器!!!! 你能帮帮我吗?

更新 我试试这个,但我的 mainviewController 现在没有出现。

 //chargement de la vue suivante
   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
   UINavigationController *naviCon = [storyboard instantiateViewControllerWithIdentifier:@"NavigationController"];
  [self presentViewController:naviCon animated:YES completion:nil];

【问题讨论】:

检查self.navigationController是否为nil。 他是零……初始化它的最佳方法是什么?在哪里?在我的 startviewcontroller 中? 【参考方案1】:

我有你的问题。

请检查导航控制器,因为是初始视图控制器

之后您的ViewController 设置为RootViewController,如下图所示

这是你的结果:

并为 HomeView 控制器“HomeID”设置一个标识符

当你导航时:

 -(void)MOve_screen
  
   HomeViewController *home = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"HomeID"];
   [self.navigationController pushViewController:home animated:YES];

 

如果有任何疑问可以随时问我:)

【讨论】:

它几乎可以工作,导航栏显示在startviewcontroller上。但是主视图控制器上没有显示导航栏 你看到我的应用程序在所有视图控制器上完美显示 现在它工作得很好;) 只需要在加载 startview 时隐藏导航栏,并在显示 mainview 之前显示它。【参考方案2】:

您需要在情节提要中为您的 navigationController 提供情节提要 ID,即“navigationController”,并且您需要添加以下行。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];   
UINavigationController *naviCon = [storyboard instantiateViewControllerWithIdentifier:@"NAVIGATION_CON_ID"];
// [naviCon addChildViewController:YOUR_VIEW_CON_OBJ];   //no need of this lines as your navigation controller is connected with your VC so it will automatically show your VC. 
[self presentViewController:naviCon animated:YES completion:nil];

所以现在您可以从情节提要和导航栏访问您的 navigationController。

【讨论】:

我做了,但是导航控制器没有加载,应用停留在starviewController上。 你有没有调试检查你是否到达了从star VC跳转到navigationCon的代码行 您是否可以使用您使用过的最新代码更新您的查询。【参考方案3】:

既然您将MainViewController 显示为:

 [self presentViewController:controller animated:YES completion:nil];

这是一个显示模式的全屏视图,而不是推送转场,也许您应该考虑将您的第一个视图嵌入导航控制器并使用推送转场。

[self.navigationController pushViewController:controller  animated:Yes];

【讨论】:

【参考方案4】:

这是我解决问题的方法。

下载数据后在startviewcontroller中:

    - (void)finishDownloadDataWithError:(NSError *)error
             [NSThread sleepForTimeInterval:3.f];
            //si il ya pas eu d'erreur on arrête la video et on éxecute loadMainView.
            if (error == nil) 
                NSLog(@"download OK");

                //simule un téléchargeemnt de 3s

                _loadingIndicator.hidden = YES;


            
            //si il ya eu des erreur on affiche la popup d'erreur.
            else 
                NSLog(@"download fail");


            
            //on utilise ce booléen pour être sur de ne créer qu'une seul fois les instances des controllers
            static BOOL firstTime = YES;
            if (firstTime) 
                firstTime = NO;


                 self.navigationController.navigationBar.hidden = NO;

                MainViewController *home = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
                [self.navigationController pushViewController:home animated:YES];

            

        

再次在 startviewcontroller 中:

  - (void)viewWillAppear:(BOOL)animated
        self.navigationController.navigationBar.hidden = YES;
    

在我的 mainViewController 中:

        - (void)viewWillAppear:(BOOL)animated

           self.navigationItem.hidesBackButton = YES;
            self.title = @"FoodStash";

           

【讨论】:

以上是关于为啥我的 UINavigationbar 被隐藏了?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 在中断从左边缘手势向右滑动后显示返回按钮,如何隐藏它以及为啥显示它?

UINavigationBar 的高度错误,因为加载时状态栏被隐藏

Swift 中的 UITableView 无法识别 UINavigationBar,填充已关闭,部分 tableview 被隐藏

在 UINavigationBar 中隐藏或禁用 UIBarButtonItem

隐藏 UIStatusBar / 移动 UINavigationBar

为啥我的 UINavigationBar 不会动画?