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];
Другие вопросы по тегам