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