11

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

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

我把它SignInViewController放在我的主故事板中吗?如果是这样,我如何从我的应用程序委托访问我的故事板?还是其他方法更好?

4

2 回答 2

24

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

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

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

可能有一种更直接的方法可以参考您的故事板,但这几乎总是会为您提供。

于 2012-04-19T18:31:33.760 回答
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。

于 2016-02-08T19:31:22.153 回答