视图中没有导航栏
Posted
技术标签:
【中文标题】视图中没有导航栏【英文标题】:No navigation bar in view 【发布时间】:2013-12-28 02:08:02 【问题描述】:我的 ios 应用中有以下结构:
-
RootViewController(显示核心数据的表视图控制器)。
-
在 RootViewController 上是一个包含 4 个按钮的视图。
按钮 1:菜单...
按下按钮 1 后,
NSManagedObjectContext
被传递给 MenuViewController。
在 MenuViewController 上有几个按钮,其中一个用于打开 DoneViewController,它与 RootViewController 重复(仅NSPredicates
更改为显示不同的核心数据对象。
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 方法不会抛出异常,但是按钮动作没有执行,应用程序冻结...
【问题讨论】:
你有与该视图链接的导航控制器吗? 不,我没有。谢谢... 【参考方案1】:您想要推送它到当前导航控制器上,而不是呈现 DoneViewController。
导航控制器 (self.navigationController
) 拥有包含导航栏的视图。将视图控制器推到它上面将导致该视图控制器的视图与导航栏一起出现在导航控制器的视图中。
【讨论】:
谢谢matt,请你详细回答一下,我试过用pushViewController改presentViewController,显示异常...【参考方案2】:当前视图控制器时添加导航控制器
- (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];
【讨论】:
这就是答案,非常感谢...但是为什么是'initWithRootViewController'? 需要在父视图控制器中推送其他视图控制器 感谢您的时间和耐心。祝你有美好的一天。【参考方案3】:如果你使用 storyboard 或 xib 并且不想将 DoneViewController 推送到 UINavigationViewController,我建议你在 storyboard 或 xib 中手动为状态栏做一个间隙。
在 iOS7 中,状态栏是透明的。因此,您的 VC 的顶部在其下方扩展。 如果你把它推到 UINavigationViewController 并且导航栏是不透明的,那就没什么可做的了。但是,如果您不这样做,请手动设置一个间隙。
编辑 抱歉,我找到了比我之前建议的更好的方法。不需要透明状态栏,在项目配置的General选项卡中将status bar style选项设置为Black Opaque。
【讨论】:
@mvasco 请查看我在帖子中的附加评论。【参考方案4】:您可以将待展示的 viewController 推送到当前(展示的)viewcontroller 的 navigationController 中。
- (IBAction)doneToDoaction:(id)sender
DoneViewController *viewController = [[DoneViewController alloc] init];
viewController.managedObjectContext = [self mainContext];
[self.navigationController pushViewController:viewController animated:YES];
【讨论】:
谢谢,但使用您的提案更新应用不会引发异常,但 DoneViewController 未显示......【参考方案5】:在您的 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];
【讨论】:
没关系。恭喜以上是关于视图中没有导航栏的主要内容,如果未能解决你的问题,请参考以下文章