来自app delegate的presentModalViewController

adi*_*dit 11 iphone objective-c ipad ios

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

XJo*_*nes 12

用你的rootViewController.您可以从任何视图控制器子类提供模态视图控制器.如果您的根VC是UITabBarController,那么您可以这样做:

[self.tabBarController presentModalViewControllerAnimated:YES]
Run Code Online (Sandbox Code Playgroud)

或者如果它是导航控制器:

[self.navigationController presentModalViewControllerAnimated:YES]
Run Code Online (Sandbox Code Playgroud)

等等

编辑:MVC

通过尝试从视图中呈现控制器,您正在打破MVC模式.通常,视图涉及其外观和暴露接口以将用户界面状态传达给其控制器.例如,如果您UIButton在视图中有一个并且希望它呈现模态视图控制器,则不要硬连接视图来执行此操作.相反,当控制器实例化视图时,控制器通过将自身设置为目标来配置按钮,以接收touchUpInside可以呈现适当的模态视图控制器的动作.

视图本身没有(也不应该)具有这种上下文知识来完成控制器的工作.

  • 如果`rootViewController`已经呈现模态视图控制器,则不起作用. (3认同)

Ste*_*eve 10

最好的方法是创建一个新的UIWindow,设置它的windowLevel属性,并UIViewController在该窗口中显示.

这是怎么回事UIAlertView.

接口

@interface MyAppDelegate : NSObject <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow * alertWindow;

...

- (void)presentCustomAlert;

@end
Run Code Online (Sandbox Code Playgroud)

执行:

@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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ams 6

应用程序代理不管理视图.您应该从第一个视图控制器的-viewDidAppear:方法呈现一个模态视图控制器,该控制器将被放入屏幕-application:didFinishLaunchingWithOptions:.