【问题标题】:presentModalViewController from app delegate来自应用委托的 presentModalViewController
【发布时间】:2012-01-11 19:15:15
【问题描述】:

如何从应用程序委托的视图中呈现模态视图控制器,最顶层?试图从 UIView 呈现模态视图控制器,这让我感到困惑。

【问题讨论】:

    标签: iphone objective-c ios ipad


    【解决方案1】:

    使用您的rootViewController。您可以从任何视图控制器子类呈现模态视图控制器。如果你的根 VC 是一个 UITabBarController,那么你可以这样做:

    [self.tabBarController presentModalViewControllerAnimated:YES]
    

    或者如果它是一个导航控制器:

    [self.navigationController presentModalViewControllerAnimated:YES]
    

    等等

    编辑:MVC

    通过尝试在视图中呈现控制器,您正在破坏 MVC 模式。通常,视图关注其外观和公开界面以将用户界面状态传达给其控制器。例如,如果您的视图中有一个UIButton,并且您希望它呈现一个模态视图控制器,您不需要硬连接视图来执行此操作。相反,当控制器实例化视图时,控制器通过将自身设置为接收touchUpInside 操作的目标来配置按钮,在该操作中它可以呈现适当的模式视图控制器。

    视图本身不(也不应该)拥有这种上下文知识来完成控制器的工作。

    【讨论】:

    • 如果 rootViewController 已经呈现模态视图控制器,则不起作用。
    • 真的,这只是一个例子。我不知道 OP 应用程序的完整逻辑。也同意理解正确的技术更好,这样你就可以在必要时完全了解你在做什么。
    • 基于UIWindow 的方法始终有效,无需自定义逻辑...就像UIAlertView 始终有效。
    • 假设 OP 想要这种行为。他可能也想要模态转换。如果您编写代码,您可以使用UIWindow 来做到这一点。您的回答很好,对于 OP 来说最好的是很难准确辨别。他有多种选择来解决问题,我支持向他展示这些选择并鼓励正确理解/使用开发范例。
    • 我同意 XJones。这是一个很好的答案,并且有效。我经常使用它。但我不明白问题出在哪里:“通过尝试从视图中呈现控制器,您正在破坏 MVC 模式” 有人可以用其他方式解释吗?谢谢
    【解决方案2】:

    最好的方法是创建一个新的UIWindow,将其设置为windowLevel 属性,然后在该窗口中显示您的UIViewController

    这就是UIAlertViews 的工作方式。

    界面

    @interface MyAppDelegate : NSObject <UIApplicationDelegate>
    
    @property (nonatomic, strong) UIWindow * alertWindow;
    
    ...
    
    - (void)presentCustomAlert;
    
    @end
    

    实施:

    @implementation MyAppDelegate
    
    @synthesize alertWindow = _alertWindow;
    
    ...
    
    - (void)presentCustomAlert
    {
        if (self.alertWindow == nil)
        {
            CGRect screenBounds = [[UIScreen mainScreen] bounds];
            UIWindow * alertWindow = [[UIWindow alloc] initWithFrame:screenBounds];
            alertWindow.windowLevel = UIWindowLevelAlert;
        }
    
        SomeViewController * myAlert = [[SomeViewController alloc] init];
        alertWindow.rootViewController = myAlert;
    
        [alertWindow makeKeyAndVisible];
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      应用程序委托不管理视图。您应该从-application:didFinishLaunchingWithOptions: 中的第一个视图控制器的-viewDidAppear: 方法中呈现一个模态视图控制器。

      【讨论】:

      • 我实际上是在尝试从 UIView 呈现一个 modalViewController,并试图在最顶层的 viewcontroller 上呈现它,有什么想法吗?
      • 模态视图控制器只能由其他视图控制器呈现。他们管理的视图不知道自己的控制器,更不用说其他视图控制器了。
      • 虽然这个答案指出了 OP 的一些误解,但它并没有真正回答这个问题。请看我的回复:UIWindow
      • 对用户而言,创建一个新窗口在功能上等同于从@XJones 指出的rootViewController 中呈现一个控制器。 OP 似乎他才刚刚开始进行 iOS 开发,鉴于问题中提供的信息,我正试图引导他采用最佳实践。去年的应用程序代理膨胀是如此。
      • 如果rootViewController 已经呈现模态视图控制器,则不会。虽然我同意代码不应该在应用程序委托中 - 向他展示如何将代码放在那里(他以后可以在其他地方重构)是完全可以接受的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多