【发布时间】:2012-01-11 19:15:15
【问题描述】:
如何从应用程序委托的视图中呈现模态视图控制器,最顶层?试图从 UIView 呈现模态视图控制器,这让我感到困惑。
【问题讨论】:
标签: iphone objective-c ios ipad
如何从应用程序委托的视图中呈现模态视图控制器,最顶层?试图从 UIView 呈现模态视图控制器,这让我感到困惑。
【问题讨论】:
标签: iphone objective-c ios ipad
使用您的rootViewController。您可以从任何视图控制器子类呈现模态视图控制器。如果你的根 VC 是一个 UITabBarController,那么你可以这样做:
[self.tabBarController presentModalViewControllerAnimated:YES]
或者如果它是一个导航控制器:
[self.navigationController presentModalViewControllerAnimated:YES]
等等
编辑:MVC
通过尝试在视图中呈现控制器,您正在破坏 MVC 模式。通常,视图关注其外观和公开界面以将用户界面状态传达给其控制器。例如,如果您的视图中有一个UIButton,并且您希望它呈现一个模态视图控制器,您不需要硬连接视图来执行此操作。相反,当控制器实例化视图时,控制器通过将自身设置为接收touchUpInside 操作的目标来配置按钮,在该操作中它可以呈现适当的模式视图控制器。
视图本身不(也不应该)拥有这种上下文知识来完成控制器的工作。
【讨论】:
rootViewController 已经呈现模态视图控制器,则不起作用。
UIWindow 的方法始终有效,无需自定义逻辑...就像UIAlertView 始终有效。
UIWindow 来做到这一点。您的回答很好,对于 OP 来说最好的是很难准确辨别。他有多种选择来解决问题,我支持向他展示这些选择并鼓励正确理解/使用开发范例。
最好的方法是创建一个新的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
【讨论】:
应用程序委托不管理视图。您应该从-application:didFinishLaunchingWithOptions: 中的第一个视图控制器的-viewDidAppear: 方法中呈现一个模态视图控制器。
【讨论】:
rootViewController 中呈现一个控制器。 OP 似乎他才刚刚开始进行 iOS 开发,鉴于问题中提供的信息,我正试图引导他采用最佳实践。去年的应用程序代理膨胀是如此。
rootViewController 已经呈现模态视图控制器,则不会。虽然我同意代码不应该在应用程序委托中 - 向他展示如何将代码放在那里(他以后可以在其他地方重构)是完全可以接受的。