从应用程序委托中呈现故事板视图控制器?

Posted

技术标签:

【中文标题】从应用程序委托中呈现故事板视图控制器?【英文标题】:Present storyboard view controller from app delegate? 【发布时间】:2012-04-19 18:24:08 【问题描述】:

我有一个视图控制器子类SignInViewController,用于随时可能需要的登录。与其让我的应用程序中的每个视图控制器都监听需要登录的通知,不如让应用程序委托来做。

但是如何从我的应用委托中触发它?

我是否将SignInViewController 放在我的主情节提要中?如果是这样,我如何从我的应用程序委托访问我的故事板?还是有其他更好的方法?

【问题讨论】:

【参考方案1】:

您始终可以通过 UIApplication 单例引用您的应用委托。 从那里你总是可以得到你的根视图控制器。 使用您的根视图控制器,您可以获得对故事板的引用。

一旦你有了故事板,你要做的就是实例化你想要的视图控制器的一个实例。 呈现它。

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;    
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[currentVC presentModalViewController:lvc animated:YES];

可能有一种更直接的方式来获取对故事板的引用,但这几乎总能帮到你。

【讨论】:

这意味着引用您当前正在使用的视图控制器,通过使用关键字“self”代替“currentVC”来完成。 但他询问了从 appDelegate “在”进入我打赌的任何视图控制器之前呈现的情况 不,我没有。知道我需要登录并不是我可以在 ios 看门狗允许我设置 UI 的短时间内做出的决定。更大的问题是来自任何视图控制器。 这个答案的问题是这会实例化一个新的视图控制器,它不会为您提供可能已经被情节提要实例化的视图控制器。【参考方案2】:

为了从任何地方(包括应用程序委托)显示视图控制器,我在 iOS 8+ 中成功使用了这段代码(我不确定早期的兼容性)。如果有,它将从模态视图中显示。

YOURAppDelegate *appDelegate =  (YOURAppDelegate *)[[UIApplication sharedApplication] delegate];
UINavigationController *rootNavC = (UINavigationController *)appDelegate.window.rootViewController;
UIViewController *topVC = rootNavC.topViewController;

UIViewController *myNewVC = [rootNavC.storyboard instantiateViewControllerWithIdentifier:<YOUR STORYBOARD ID>];

if (topVC.presentedViewController)

    if ([topVC.presentedViewController class] == [UINavigationController class])
    
        dispatch_async(dispatch_get_main_queue(), ^
            [((UINavigationController*)topVC.presentedViewController) pushViewController:myNewVC
                                                                                animated:YES];
        );
    
    else
    
        dispatch_async(dispatch_get_main_queue(), ^
            [topVC.presentedViewController.navigationController pushViewController:myNewVC
                                                                          animated:animated];
        );
    

else

    dispatch_async(dispatch_get_main_queue(), ^
        [rootNavC pushViewController:myNewVC
                            animated:animated];
    );

我通常将它包装在一个方便的方法中并传入我的实例化视图控制器。对于 OP - 您将在情节提要中创建 SignInViewController,为其分配一个唯一的情节提要 ID,然后在上述代码中替换该 ID。

【讨论】:

以上是关于从应用程序委托中呈现故事板视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

从 UIScrollView 子视图呈现故事板 UIViewController

应用程序试图在目标上呈现一个 nil 模态视图控制器

如何从 appdelegate 呈现和关闭模态视图?

如何在 IOS 应用程序中从视图控制器重定向回主故事板

应用于控制器的背景未应用于故事板swift中的表格视图单元格

故事板中的PresentModalViewController以编程方式iOS 5