从 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的主要内容,如果未能解决你的问题,请参考以下文章
addSubview与呈现模式ViewController之间的区别?
为啥我的 superview-with-subview 在模态显示(使用自动布局)时会缩小?