从 SubView 呈现模态 ViewController

Posted

技术标签:

【中文标题】从 SubView 呈现模态 ViewController【英文标题】:Present modal ViewController from SubView 【发布时间】:2011-06-24 17:49:35 【问题描述】:

我正在尝试从视图控制器 B 呈现模态视图控制器 C。B 的视图不覆盖全屏,并且是另一个视图控制器 A 的子视图。当我尝试呈现全屏模式时看到的内容模式是否覆盖全屏,但是当我点击屏幕中的某些位置时,控件将“通过”到 A 的视图。

我可以通过某种委托从 A 呈现模态来绕过这个,但我不知道为什么会发生这种情况!毕竟,如果您有一个标签栏控制器来管理您的一个视图,并且您尝试呈现一个模态视图,它就可以很好地覆盖整个屏幕。幕后有什么魔力吗?

【问题讨论】:

【参考方案1】:

我认为没有关于模态如何实现的任何官方文档,但是任何视图都可以获取UIApplication 的UIWindow 并在rootViewController 属性上调用-presentModal...。这将产生使您的模态全屏的效果。我相信还有其他方法可以达到同样的效果。

[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:myModalVC animated:YES];

在这种情况下,您需要为所有视图控制器实现自己的“模态”方法,使用 addSubview: 和 BringSubviewToFront:。我已经在我的一个较大的项目中做到了这一点,我希望从模态视图中获得一些不同的行为。

【讨论】:

这实际上是我所做的……不过似乎有些不尽人意。例如,如果您尝试在模态上显示模态,则此技术不起作用,因为第二个模态现在显示在第一个模态下方。 是的,我已经通过调用根视图控制器做到了这一点。这似乎仍然是最划算的。 我遇到了 ios 5 iPad 不显示我呈现的视图控制器的问题,这是我使用的修复程序,非常感谢!【参考方案2】:

这对我有用:

UIViewController* vc = [[[UIViewController alloc] init] autorelease];
UIWindow* keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView* topView = [[keyWindow subviews] objectAtIndex:[[keyWindow subviews] count] - 1];
vc.view = topView;

[vc presentModelViewController...

基本上,您创建一个新的 UIViewController 并将其附加到主窗口的最顶层视图(即用户当前看到的视图)。

【讨论】:

Messaging dismissModalViewControllerAnimated: 在模态视图控制器上似乎不再使用您的解决方案消除视图 Elad...有什么想法吗? 同理,使用新符号:UIView *topView = [[UIApplication sharedApplication].keyWindow.subviews lastObject];【参考方案3】:

简单,但不确定接受度和效率。这是我用的。

    将所有视图控制器嵌入到 rootView 下方的 mainView 中。 在禁用主视图的 userInteractionEnabled 标志时,将任何模态视图添加到 rootView。模态视图应该添加到 rootView 而不是 mainView 完成后,重新启用 mainView 的用户交互。

希望这会有所帮助...

【讨论】:

以上是关于从 SubView 呈现模态 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器的呈现视图控制器不旋转

关闭模态呈现的 VC 和弹出呈现的 VC

addSubview与呈现模式ViewController之间的区别?

为啥我的 superview-with-subview 在模态显示(使用自动布局)时会缩小?

从模态呈现的视图控制器内部呈现 UIPopoverController

如何从 UIPopoverController 呈现模态视图?