Почему UIActivityViewController не отклоняет MFMailComposeViewController, если ведущий является дочерним элементом UITabbarController?

У меня очень простой случай, когда кнопка показывает UIActivityViewController, чтобы поделиться некоторым контентом. Проблема в том, что составитель почты не закрывается, когда пользователь отменяет или отправляет электронное письмо.

NSArray *items = [NSArray arrayWithObjects:@"share",nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

Я попытался отключить модальное представление в activityViewController.completionHandler, но затем консоль сообщает, что выполняется другая анимация, и иногда приводит к сбою приложения, так что это не решение. К тому же другие социальные сети работают хорошо (facebook, twitter), ничего не делая.

После некоторых тестов я обнаружил, что это происходит только в том случае, если UIViewController, представляющий UIActivityViewController, является потомком UITabBarController. Если в моем AppDelegate я создаю такое приложение, оно не работает:

UIViewController > UINavigationController > UITabbarController > Window

но если я удалю панель вкладок, все будет работать нормально !:

UIViewController > UINavigationController > Window 

Обходной путь, который решает проблему, представляет rootviewcontroller.

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:NULL];

но я хочу знать, что здесь происходит.

Спасибо! ;)


person alejandromp    schedule 05.11.2013    source источник


Ответы (1)


У меня была такая же проблема, и после выяснения я узнал, что, когда мы не представляем почтовый композитор из класса, который в настоящее время активен в окне, он не сможет принимать ответы некоторое время, как будто он не будет даже присутствовать при каждом вызове , такая же проблема с увольнением. Дело не только в UITabbarController. Это может случиться с любой архитектурой, когда вы представляете ее с другого контроллера, который в данный момент не в окне. Вот почему ваш обходной путь работает, и это не так.

Я представлял mail composer с помощью кнопки внутри uipopover. Компоновщик почты был представлен в этом классе контроллера всплывающего окна. И я столкнулся с той же проблемой, с которой столкнулись вы. Затем я изменил свой код на:

MFMailComposeViewController *mailComposer = [MFMailComposeViewController new];

    [mailComposer addAttachmentData:data mimeType:@"application/pdf" fileName:model.documentTitle];

    [mailComposer setSubject:model.documentTitle]; // Use the document file name for the subject

    if(kBccEmailID)
        [mailComposer setBccRecipients:[[NSArray alloc]initWithObjects:kBccEmailID, nil ]];

    mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    mailComposer.modalPresentationStyle = UIModalPresentationFormSheet;

    AppDelegate *delagate =(AppDelegate *) [[UIApplication sharedApplication]delegate];

    mailComposer.mailComposeDelegate = [[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]; // Set the delegate


    [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] presentViewController:mailComposer animated:YES completion:nil];

[(UIViewController *) [[(UINavigationController *) delagate.window.rootViewController viewControllers] lastObject] является альтернативой вашему 'self.view.window.rootViewController'.

person Kumar Aditya    schedule 05.11.2013
comment
Интересно! Но я не понимаю, как система определяет какой класс сейчас активен в окне. Почему, когда VC находится в tabbarcontroller, он считает, что это не активный контроллер? - person alejandromp; 05.11.2013
comment
Вам не нужно об этом беспокоиться. Об этом позаботится система. Он отслеживает контроллеры представления через стек, который выводит его на вершину. - person Kumar Aditya; 05.11.2013