来自应用委托的 presentModalViewController

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 已经呈现模态视图控制器,则不会。虽然我同意代码不应该在应用程序委托中 - 向他展示如何将代码放在那里(他以后可以在其他地方重构)是完全可以接受的。

以上是关于来自应用委托的 presentModalViewController的主要内容,如果未能解决你的问题,请参考以下文章

委托是不是具有每次应用程序来自后台时执行的功能

代理 K8S 应用程序委托对来自其他 pod 的请求进行身份验证

来自 AppDelegate 的 UISegmentedControl

推送通知的“查看”委托

快速访问应用程序委托变量延迟视图加载

c#委托