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

11
我有一个视图控制器子类,SignInViewController,用于登录,可能随时需要。与其让我的应用中每个视图控制器都监听需要登录的通知,我宁愿让应用委托来监听。
但是我该如何从我的应用委托触发它呢?
我是否应该将SignInViewController放在我的主故事板中?如果是这样,我该如何从我的应用委托访问我的故事板呢?还是有其他更好的方法?
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];

可能有更直接的方法来获取您的故事板的引用,但这几乎总是可以为您获取它。


这意味着引用您当前正在工作的视图控制器,使用关键字“self”代替“currentVC”来完成。 - Darryl Bayliss
5
但他询问关于在进入任何视图控制器之前从appDelegate中呈现的事情,我敢打赌。 - Zerho
不,我没有。知道我需要登录并不是我可以在iOS看门狗允许我设置UI的短时间内做出的决定。更大的问题是从任何视图控制器开始。 - Steven Fisher
1
这个答案的问题在于它实例化了一个新的视图控制器,而不是给你可能已经由故事板实例化的视图控制器。 - lostintranslation

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接