我有一个带有根视图控制器的主导航控制器。在根视图控制器中,按下按钮我会出现如下第二个视图控制器:
SecondVC *secondVC = [[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
[self.navigationController presentModalViewController:secondVC animated:YES];
在第二个视图控制器中,按下另一个按钮,我想呈现第三个视图控制器(这次来自故事板):
ThirdVC *thirdVC = [[UIStoryboard storyboardWithName:@"Settings" bundle:nil] instantiateInitialViewController];
[self.navigationController presentModalViewController:thirdVC animated:YES];
然而,这没有任何作用。我调试了结果,self.navigationController
是nil
。
它不应该是主导航控制器吗?或者没有presentModalViewController:将视图控制器添加到堆栈?在以模态方式呈现ID之前,我是否总是必须将视图控制器放在导航控制器中?
答案 0 :(得分:3)
新的视图控制器SecondVC正在以模态方式呈现,并且它未添加到navigationController的视图控制器堆栈中。您需要创建一个新的UINavigationController,并在以模态方式呈现它之前将SecondVC放在navController中。
答案 1 :(得分:1)
您需要添加以下内容:
UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController:secondVC];
[self addChildViewController:navController];
[self.navigationController presentModalViewController:secondVC animated:<#(BOOL)#>]
答案 2 :(得分:0)
您的视图控制器在呈现时不在导航控制器内。并且无法访问呈现控制器导航控制器。
此外,如果您在模态视图控制器下方的导航控制器上按下或弹出堆叠项目,您可能不会注意到任何内容。
如果你想把控制器放在堆栈中,你可以自己显示视图控制器。
[self.view addSubView:myViewController.view]
myViewController.view.frame = self.view.bounds;
要关闭视图控制器,只需将其从超级视图中删除即可。
这里的缺点是在视图控制器上没有调用一些已经和将要出现的方法。因此,您可能需要自己打电话。
但校长大致相同。您可以使用动画系统轻松模拟演示动画。
在表单下面给它一个起点,然后启动你的动画块并将view.frame放到superview.bounds也给它一个动画时间。我发现2秒就可以了。有时少。
此时,所呈现的视图位于堆栈中的控制器内部。现在,当您无法直接修改显示的视图控制器中的导航控制器时,您可以设置一个委托,告诉原始您的意图,因此呈现视图控制器(导航堆栈上的控制器)可以按要求推送或弹出视图控制器。并且呈现的视图控制器将随之推送。另一个积极的一点是,您可以像其他应用程序那样做,并提供半模式视图。具有部分透明的背景。通过这种方式,你可以显示视图背后发生的事情,即使他们不直接操纵它。