视图中没有导航栏

时间:2013-12-28 02:08:03

标签: ios uinavigationcontroller

我的iOS应用程序中有以下结构:

  1. RootViewController(显示核心数据的表视图控制器)。
  2. RootViewController

    1. On RootViewController是一个包含4个按钮的视图。
    2. 按钮1:菜单...
    3. 按下按钮1后,NSManagedObjectContext将传递给MenuViewController。
    4. 在MenuViewController上有几个按钮,其中一个用于打开DoneViewController,它是RootViewController的一个副本(只有NSPredicates被更改为显示不同的核心数据对象。
    5. DoneViewController正确显示了预期的行,但它应该有一个导航栏,但未显示。

      DoneViewController

      这是用于打开DoneViewController的代码:

      - (IBAction)doneToDoaction:(id)sender {
          DoneViewController *viewController = [[DoneViewController alloc] init];
          viewController.managedObjectContext = [self mainContext];
          [self presentViewController:viewController animated:YES completion:nil];
      }
      

      如何打开视图并拥有像RootViewController一样的导航栏?


      我现在将把现在在我的应用程序中的所有导航控制器实例:

      //AppDelegate.m
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
        // Fetch the data to see if we ought to pre-populate
        NSError *error = nil;
        if (![[self fetchedResultsController] performFetch:&error]) {
          NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
          abort();
        }
      
        [self loadFavoriteThingsData];
      
      
        RootViewController *rootViewController = (RootViewController *)
      
          [navigationController topViewController];
        [rootViewController setManagedObjectContext:[self managedObjectContext]];
      
      
        [window addSubview:[navigationController view]];
        [window makeKeyAndVisible];
        return YES;
      }
      
      //RootViewController
      - (IBAction)MenuToDoAction:(id)sender {
      
          MenuViewController *viewController = [[MenuViewController alloc] init];
      
          viewController.mainContext = [self managedObjectContext];
          [self presentViewController:viewController animated:YES completion:nil];
      
      }
      
      //MenuViewController
      - (IBAction)doneToDoaction:(id)sender {
          DoneViewController *viewController = [[DoneViewController alloc] init];
          viewController.managedObjectContext = [self mainContext];
          [self.navigationController pushViewController:viewController animated:YES];
      }
      

      @EricLee提出的最后一个doneToDoaction方法不会抛出异常,但是不执行按钮操作并且应用程序冻结......

5 个答案:

答案 0 :(得分:2)

而不是呈现 DoneViewController,您希望推送到当前导航控制器。

导航控制器(self.navigationController)具有包含导航栏的视图。将视图控制器推到其上将导致视图控制器的视图与导航栏一起显示在导航控制器的视图中。

答案 1 :(得分:1)

如果您使用storyboard或xib并且不想将DoneViewController推送到UINavigationViewController,我建议您在storyboard或xib中手动创建状态栏的间隙。

在iOS7中,状态栏是透明的。因此,VC的顶部会在它下面扩展 如果将其推送到UINavigationViewController并且导航栏是不透明的,则无需执行任何操作。但是,如果您不这样做,请手动设置间隙。

修改
对不起,我找到了比我之前建议的更好的方法。您不需要透明状态栏,在项目配置的常规选项卡中将状态栏样式选项设置为黑色不透明

答案 2 :(得分:1)

您可以将待呈现的viewController推送到当前(呈现)viewcontroller的navigationController。

- (IBAction)doneToDoaction:(id)sender {
    DoneViewController *viewController = [[DoneViewController alloc] init];
    viewController.managedObjectContext = [self mainContext];
    [self.navigationController pushViewController:viewController animated:YES];
}

答案 3 :(得分:1)

当前视图控制器添加导航控制器

- (IBAction)doneToDoaction:(id)sender {
    DoneViewController *viewController = [[DoneViewController alloc] init];
    viewController.managedObjectContext = [self mainContext];
UINavigationController * nVC=[[UINavigationController alloc] initWithRootViewController:viewController];
    [self presentViewController:nVC animated:YES completion:nil];
}

答案 4 :(得分:0)

在你的AppDelegate didFinishLaunchingWithOptions

self.window = [[UIWindo walloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.controller = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.controller];
self.window.rootViewController = nav;
[self.window addSubview:nav.view];
[self.window makeKeyAndVisible];