Представить диспетчер просмотра раскадровки из делегата приложения?

У меня есть подкласс класса просмотра, 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];

Может быть более прямой способ получить ссылку на ваш раскадровки, но это почти всегда получит его для вас.

Ответ 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 в раскадровке, назначить ему уникальный идентификатор раскадровки, а затем заменить этот идентификатор в приведенном выше коде.