Почта и сообщение не исчезают из просмотра предупреждений

У меня есть UIAlertView, который запускает электронную почту и экран сообщений. Когда пользователь нажимает кнопку оповещения, открываются оба вида, но не закрываются.

Я попытался добавить:

-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    [self dismissModalViewControllerAnimated:YES];
}

к телу класса, однако, это не помогло.

Вот как представлено электронное письмо:

    [viewController presentViewController:email animated:YES completion:nil];

Изменить Вот весь код, который я использую для представления электронного письма:

//send email...
-(void)sendEmail{

    //mail composer
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
    if(mailClass != nil){
        if([mailClass canSendMail]){

            //get the current view controller from the App Delegate
            apptester_appDelegate *appDelegate = (apptester_appDelegate *)[[UIApplication sharedApplication] delegate];
            UIViewController *viewController = [appDelegate getViewController];

            MFMailComposeViewController *email = [[MFMailComposeViewController alloc] init];
            email.mailComposeDelegate = self;

            //navigation bar color depends on iOS7 or lower...
            if(floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
                [[email navigationBar] setTintColor:[UIColor blackColor];
            }else{
                [[email navigationBar] setBarTintColor:[UIColor blackColor]];
            }

            //show the model view...
            [viewController presentViewController:email animated:YES completion:nil];

        }
    }
}

Кто-нибудь еще испытал эту ошибку?

Это может быть неактуально, но в этом приложении есть панель вкладок.


person Jake Chasan    schedule 17.03.2014    source источник
comment
И это тело класса является делегатом?   -  person trojanfoe    schedule 17.03.2014
comment
Нет, это просто файл .m для представления, которое запускает представление предупреждений. Как вы думаете, я должен поместить его в App Delegate?   -  person Jake Chasan    schedule 17.03.2014
comment
Как вы представляете VC?   -  person David Berry    schedule 17.03.2014
comment
Нет, но класс, содержащий метод, который вы показываете, оказывает влияние только в том случае, если он является делегатом представления композитора.   -  person trojanfoe    schedule 17.03.2014
comment
Вот логика: представление предупреждений представляется из класса с контроллером представления. Электронная почта и сообщения отправляются из класса, который является родительским классом для контроллера представления. При нажатии кнопки оповещения метод [self sendEmail]; или [самостоятельно отправить сообщение]; называются.   -  person Jake Chasan    schedule 17.03.2014
comment
Вы, кажется, не понимаете. Этим композиторам для работы нужен делегат. Вы предоставили метод делегата, но правильно ли вы его подключили?   -  person trojanfoe    schedule 17.03.2014
comment
Я уже реализовал email.mailComposeDelegate = self; и добавил вышеуказанный метод в класс, который представляет контроллер модального представления.   -  person Jake Chasan    schedule 17.03.2014
comment
Наконец-то вы ответили на мой вопрос из первого комментария.   -  person trojanfoe    schedule 17.03.2014
comment
Как вы думаете, может ли это быть связано с тем, что письмо представлено как стандартный контроллер представления, а не модальный контроллер представления?   -  person Jake Chasan    schedule 17.03.2014
comment
К сведению: не проверяйте номер версии, чтобы решить, вызывать ли setBarTintColor или нет. Правильный способ: if ([[email navigationBar] respondsToSelector(@selector(setBarTintColor:)]).   -  person rmaddy    schedule 17.03.2014


Ответы (3)


Убедитесь, что вы установили делегата для почтового контроллера

   mail.mailComposeDelegate = viewController;

Также попробуйте это,

    [viewController.tabBarController presentViewController:email animated:YES completion:nil];

Вы пробовали этот метод и передавали «контроллер» вместо себя:

   -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
    {
       [controller dismissViewControllerAnimated:YES completion:nil];
    }

Спасибо!

person Natarajan    schedule 17.03.2014
comment
Итак, я попробовал это, и он закрывается, когда он не вызывается из представления предупреждений. Поэтому, если я вызову его из табличного представления, это нормально, но не из представления предупреждений. Ты знаешь почему? - person Jake Chasan; 17.03.2014
comment
Не могли бы вы предоставить свой код, который отображается в режиме оповещения? - person Natarajan; 17.03.2014
comment
Пожалуйста, смотрите редактирование моего исходного поста. Это то, что вы хотели? - person Jake Chasan; 17.03.2014
comment
Большое спасибо, я думаю, что это решило проблему. - person Jake Chasan; 17.03.2014
comment
Почему этот ответ был принят? Это неправильно. Вы не устанавливаете свойство delegate. Существует другое свойство, которое необходимо установить. Смотрите мой ответ. - person rmaddy; 17.03.2014
comment
@rmaddy Он уже установил делегата как email.mailComposeDelegate = self; - person Natarajan; 17.03.2014
comment
Хорошо, я не заметил обновленный вопрос. Это не меняет того факта, что установка свойства delegate не является частью решения. - person rmaddy; 17.03.2014

Ответственность за то, чтобы закрыть модальное представление, лежит на представленном контроллере. Убедитесь, что вы реализуете делегат модального окна в представленном контроллере.

person Mika    schedule 17.03.2014

Две вещи:

1) Перед презентацией убедитесь, что вы установили mailComposeDelegate на MFMailComposeViewController.

2) В вашем методе mailComposeController:didFinishWithResult:error: вы должны сделать:

[controller dismissModalViewControllerAnimated:YES];
person rmaddy    schedule 17.03.2014