没有导航栏在视图中

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

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

RootViewController的

  1. 在RootViewController上是一个包含4个button的视图。
  2. button1:菜单…
  3. 按下button1之后, NSManagedObjectContext被传递给MenuViewController。
  4. 在MenuViewController上有几个button,其中一个是用来打开DoneViewController的,这是从RootViewController复制的(只有NSPredicates改变为显示不同的核心数据对象。

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方法不会引发exception,但是button操作不会执行,应用程序会冻结…

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

 - (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]; } 

而不是呈现 DoneViewController,你想把它到当前的导航控制器。

导航控制器( self.navigationController )具有包含导航栏的视图。 将视图控制器放到它上面会导致视图控制器的视图和导航栏一起出现在导航控制器的视图中。

如果你使用storyboard或者xib而不想把DoneViewController推到UINavigationViewController,我build议你在storyboard或xib中手动为状态栏做一个空白。

在iOS7中,状态栏是透明的。 因此,你的VC的顶部是扩展下。
如果你把它推到UINavigationViewController和导航栏是不透明的,没有什么可做的。 但是,如果你不这样做,手动设置一个差距。

编辑
对不起,我find了比我之前build议的更好的方法。 您不需要透明的状态栏,在项目configuration的常规选项卡中将状态栏样式选项设置为黑色不透明

您可以将待呈现的viewController推送到当前(呈现)视图控制器的navigationController中。

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

在你的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];