我的iOS应用程序中有以下结构:
NSManagedObjectContext
将传递给MenuViewController。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方法不会抛出异常,但是不执行按钮操作并且应用程序冻结......
答案 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];