来自应用委托的 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
。
这就是UIAlertView
s 的工作方式。
界面
@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 的请求进行身份验证