0

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

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 之前,我是否总是必须将视图控制器放在导航控制器中?

4

3 回答 3

3

新的视图控制器 SecondVC 以模态方式呈现,它没有添加到 navigationController 的视图控制器堆栈中。您需要创建一个新的 UINavigationController,并将 SecondVC 放入 navController 中,然后再以模态方式呈现它。

于 2012-08-23T18:32:04.170 回答
1

您需要添加以下内容:

UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController:secondVC];
[self addChildViewController:navController];
[self.navigationController presentModalViewController:secondVC animated:<#(BOOL)#>]
于 2012-08-23T20:27:53.920 回答
0

呈现时您的视图控制器不在导航控制器内。并且将无法访问呈现控制器的导航控制器。

此外,如果您在模态视图控制器下方的导航控制器上推送或弹出堆栈项,您可能不会注意到任何内容。

如果您想将控制器放入堆栈中,您也可以自己显示视图控制器。

[self.view addSubView:myViewController.view]
myViewController.view.frame = self.view.bounds;

要关闭视图控制器,您只需将其从其父视图中删除即可。

这里的缺点是视图控制器上没有调用一些做和将出现的方法。因此,您可能想自己调用它们。

但校长大同小异。并且您可以使用动画系统轻松模拟呈现动画。

在您的表单下方给它一个起点,然后启动您的动画块并将 view.frame 放入 superview.bounds 也给它一个动画时间。我发现2秒是可以的。有时更少。

此时呈现的视图位于堆栈上的控制器内部。现在,虽然您不能直接在呈现的视图控制器中修改导航控制器,但您可以设置一个委托来告诉原始您的意图,因此呈现的视图控制器(导航堆栈上的那个)可以按要求推送或弹出视图控制器。并且呈现的视图控制器将与它一起被推送。

另一个积极的方面是您可以像其他应用程序一样做很多事情,并呈现半模态视图。具有部分透明的背景。这样,即使他们不直接操纵它,您也可以显示视图背后发生的事情。

于 2012-08-23T18:42:54.053 回答