presentModalViewController:将视图控制器添加到堆栈中吗?

时间:2012-08-23 18:29:55

标签: objective-c cocoa uiviewcontroller uinavigationcontroller uistoryboard

我有一个带有根视图控制器的主导航控制器。在根视图控制器中,按下按钮我会出现如下第二个视图控制器:

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.navigationControllernil

它不应该是主导航控制器吗?或者没有presentModalViewController:将视图控制器添加到堆栈?在以模态方式呈现ID之前,我是否总是必须将视图控制器放在导航控制器中?

3 个答案:

答案 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秒就可以了。有时少。

此时,所呈现的视图位于堆栈中的控制器内部。现在,当您无法直接修改显示的视图控制器中的导航控制器时,您可以设置一个委托,告诉原始您的意图,因此呈现视图控制器(导航堆栈上的控制器)可以按要求推送或弹出视图控制器。并且呈现的视图控制器将随之推送。

另一个积极的一点是,您可以像其他应用程序那样做,并提供半模式视图。具有部分透明的背景。通过这种方式,你可以显示视图背后发生的事情,即使他们不直接操纵它。