来自app delegate的presentModalViewController

时间:2012-01-11 19:15:15

标签: iphone objective-c ios ipad

如何从app delegate的视图中呈现模态视图控制器,这是最顶级的?试图从UIView呈现一个模态视图控制器,这让我很困惑。

3 个答案:

答案 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:的屏幕上。