是否存在 Modal ViewController: 将视图控制器添加到堆栈中?
Posted
技术标签:
【中文标题】是否存在 Modal ViewController: 将视图控制器添加到堆栈中?【英文标题】:Does presentModalViewController: add the view controller to the stack? 【发布时间】:2012-08-23 18:29:55 【问题描述】:我有一个带有根视图控制器的主导航控制器。在根视图控制器中,按一下按钮,我将呈现第二个视图控制器,如下所示:
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 之前,我是否总是必须将视图控制器放在导航控制器中?
【问题讨论】:
【参考方案1】:新的视图控制器 SecondVC 以模态方式呈现,并没有添加到 navigationController 的视图控制器堆栈中。您需要创建一个新的 UINavigationController,并将 SecondVC 放入 navController 中,然后再以模态方式呈现它。
【讨论】:
这是我怀疑的,但我找不到任何来源。感谢您的验证。【参考方案2】:您需要添加如下内容:
UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController:secondVC];
[self addChildViewController:navController];
[self.navigationController presentModalViewController:secondVC animated:<#(BOOL)#>]
【讨论】:
【参考方案3】:呈现时您的视图控制器不在导航控制器内。并且将无法访问呈现控制器的导航控制器。
此外,如果您在模态视图控制器下方的导航控制器上推送或弹出堆栈项,您可能不会注意到任何内容。
如果您想将控制器放入堆栈中,您也可以自己显示视图控制器。
[self.view addSubView:myViewController.view]
myViewController.view.frame = self.view.bounds;
要关闭视图控制器,您只需将其从其父视图中删除即可。
这里的缺点是视图控制器上没有调用一些 did 和 will appear 方法。因此,您可能需要自己调用它们。
但校长大同小异。并且您可以使用动画系统轻松模拟呈现动画。
在表单下方给它一个起点,然后启动动画块并将 view.frame 放到 superview.bounds 中,同时给它一个动画时间。我发现2秒是可以的。有时更少。
此时呈现的视图位于堆栈上的控制器内部。现在,虽然您不能直接在呈现的视图控制器中修改导航控制器,但您可以设置一个委托来告诉原始您的意图,因此呈现的视图控制器(导航堆栈上的那个)可以按要求推送或弹出视图控制器。并且呈现的视图控制器将随之推送。
另一个积极点是,您可以像其他应用一样做很多事情,并呈现半模态视图。具有部分透明的背景。通过这种方式,您可以显示视图背后发生的事情,即使他们不直接操作它。
【讨论】:
以上是关于是否存在 Modal ViewController: 将视图控制器添加到堆栈中?的主要内容,如果未能解决你的问题,请参考以下文章
iOS Modal Segue 丢弃源 ViewController?
检测ViewController是否显示为FormSheet