来自app delegate的故事板视图控制器?

时间:2012-04-19 18:24:09

标签: ios uistoryboard

我有一个视图控制器子类SignInViewController,用于登录,可能随时需要。而不是让我的应用程序中的每个视图控制器都听取需要登录的通知,我宁愿让应用程序委托执行此操作。

但是如何从我的应用代表中触发它?

我是否将SignInViewController放在我的主要故事板中?如果是这样,我如何从我的应用代表访问我的故事板?还是其他方法更好?

2 个答案:

答案 0 :(得分:24)

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

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

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

可能有一种更直接的方式来获取对故事板的引用,但这几乎总能为您提供。

答案 1 :(得分:0)

要从任何地方显示视图控制器(包括应用程序委托),我已经在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。