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

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

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

【问题讨论】:

    标签: ios objective-c modalviewcontroller


    【解决方案1】:

    我认为没有关于模态如何实现的任何官方文档,但是任何视图都可以获取UIApplicationUIWindow 并在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】:

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

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

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2017-07-26
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多