如何从app delegate的视图中呈现模态视图控制器,这是最顶级的?试图从UIView呈现一个模态视图控制器,这让我很困惑。
答案 0 :(得分:11)
使用您的rootViewController
。您可以从任何视图控制器子类提供模态视图控制器。如果您的根VC是UITabBarController,那么您可以这样做:
[self.tabBarController presentModalViewControllerAnimated:YES]
或者如果是导航控制器:
[self.navigationController presentModalViewControllerAnimated:YES]
等
编辑:MVC
通过尝试从视图中呈现控制器,您正在打破MVC模式。通常,视图涉及其外观和暴露接口以将用户界面状态传达给其控制器。例如,如果视图中有UIButton
并且您希望它呈现模态视图控制器,则不要硬连接视图来执行此操作。相反,当控制器实例化视图时,控制器通过将自身设置为接收touchUpInside
动作的目标来配置按钮,在该动作中它可以呈现适当的模态视图控制器。
视图本身没有(也不应该)具有这种上下文知识来完成控制器的工作。
答案 1 :(得分:10)
执行此操作的最佳方法是创建新的UIWindow
,设置其windowLevel
属性,并在该窗口中显示UIViewController
。
这就是UIAlertView
的工作方式。
<强>接口强>
@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
答案 2 :(得分:6)
应用程序代理不管理视图。您应该使用第一个视图控制器的-viewDidAppear:
方法呈现模态视图控制器,该方法将放在-application:didFinishLaunchingWithOptions:
的屏幕上。