presentViewController из sharedInstance служебного класса
Я хотел бы представить MFMailComposerViewController из некоторого кода, который находится глубоко внутри класса утилит, доступного через общий экземпляр.
Когда я попробую это с
[self presentViewController:mailVC animated:YES completion:nil];
Я получаю ошибку, что представление представления не находится в иерархии представления, которая имеет смысл.
Когда я пытаюсь использовать навигационный контроллер:
[self.navigationController presentViewController:mailVC animated:YES completion:nil];
ошибка не возникает, но ничего не происходит.
Имеет смысл представить его из VC, который вызывает sharedInstance, но я не знаю, как ссылаться на него из общего экземпляра.
Спасибо за любые предложения о том, как это сделать.
1 ответ
Вы можете представить его из самого контроллера сверху. Вот что я сделал, чтобы получить один.
+ (UIViewController *)topViewController {
UIViewController *topController = [[UIApplication sharedApplication].windows firstObject].rootViewController;
if ([topController isKindOfClass:[UINavigationController class]]) {
topController = [[(UINavigationController *)topController viewControllers] lastObject];
}
while (topController.presentedViewController) {
topController = topController.presentedViewController;
if ([topController isKindOfClass:[UINavigationController class]]) {
topController = [[(UINavigationController *)topController viewControllers] lastObject];
}
}
return topController;
}
Я считаю, что у вас есть два варианта для этого в зависимости от архитектуры приложения:
1) Передайте контроллер представления представления, проверьте его действительность и затем представьте контроллер представления почты.
-(void)sendEmailFromViewController:presentingViewController:(UIViewController*)viewController
//Ensure viewController is valid
[viewController presentViewController:mailVC animated:YES completion:nil];
2) Подарок от корневого контроллера навигации. Что-то вроде ниже, как только вы создали свою электронную почту.
UIViewController* rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
[rootViewController presentViewController:mailVC animated:YES completion:nil];