Как предотвратить сбой при отмене MFMailComposeViewController?

Где-то:

if([MFMailComposeViewController canSendMail])
{
    MFMailComposeViewController *email_vc = [[MFMailComposeViewController alloc] init];
    email_vc.mailComposeDelegate = self;

    [email_vc setSubject:subject];
    [email_vc setMessageBody:message isHTML:FALSE];
    [email_vc setToRecipients:recipients];

    [self presentModalViewController:email_vc animated:FALSE];
    [[UIApplication sharedApplication] setStatusBarHidden:TRUE];
    [email_vc release];
}
else
...

Где-то еще:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
    switch (result) 
    {
        case MFMailComposeResultCancelled:
            NSLog(@"Cancelled");
            break;

        case MFMailComposeResultSaved:
            NSLog(@"Saved");
            break;

        case MFMailComposeResultSent:
            NSLog(@"Sent");
            break;

        case MFMailComposeResultFailed:
            NSLog(@"Compose result failed");
            break;

        default:
            NSLog(@"Default: Cancelled");
            break;
    }

    // This ugly thing is required because dismissModalViewControllerAnimated causes a crash
    // if called right away when "Cancel" is touched.

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_current_queue(), ^
    {
        [self dismissModalViewControllerAnimated:FALSE];
    }); 

}

Этот уродливый блок "dispatch _after" - единственный способ заставить его работать без сбоев.

Контекст заключается в том, что прикосновение к чему-либо, кроме «Отправить», на контроллере представления электронной почты приведет к сбою. Есть ли способ справиться с этим, не прибегая к помощи этой уродливой группы -? Моя теория о полосе -заключается в том, что промежуточный вид отображается, когда вы нажимаете «Отмена», чтобы подтвердить, что пользователь действительно хочет отменить. Мне интересно, пытается ли [self dismissModalViewControllerAnimated:FALSE];отклонить представление вне последовательности или что-то в этом роде. Вставляя небольшую задержку, я предполагаю, что представление создания почты успевает очиститься, прежде чем его попросят уйти.

Я видел задержку, использованную в другом вопросе. Однако автор не стал вдаваться в подробности :

. Сбой в MFMailComposeViewController для iPad

РЕДАКТИРОВАТЬ 1 :Добавление журнала сбоев

Incident Identifier: ****************
CrashReporter Key:   *****************
Hardware Model:      iPhone4,1
Process:         ************* [9038]
Path:            /var/mobile/Applications/*********************
Identifier:      ***********************
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-07-20 11:25:53.704 -0700
OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xa003853a
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x316b9fbc 0x316b6000 + 16316
1   UIKit                           0x350caa9e 0x34f8e000 + 1297054
2   UIKit                           0x34fa6814 0x34f8e000 + 100372
3   UIKit                           0x34fabfb2 0x34f8e000 + 122802
4   QuartzCore                      0x33354ba0 0x33329000 + 179104
5   libdispatch.dylib               0x37896f74 0x37894000 + 12148
6   CoreFoundation                  0x37bac2d6 0x37b20000 + 574166
7   CoreFoundation                  0x37b2f4d6 0x37b20000 + 62678
8   CoreFoundation                  0x37b2f39e 0x37b20000 + 62366
9   GraphicsServices                0x376adfc6 0x376aa000 + 16326
10  UIKit                           0x34fbf73c 0x34f8e000 + 202556
11  *****************               0x00002346 main (main.m:14)
12  *****************               0x00002304 start + 32

РЕДАКТИРОВАТЬ 2 :После долгих раздумий выяснилось, что это настоящая ошибка Apple.

Я скачал и запустил пример проекта MailComposer :

http://developer.apple.com/library/ios/#samplecode/MailComposer/Introduction/Intro.html

. Это работает нормально.

Затем я отредактировал код, чтобы удалить анимацию при представлении и закрытии контроллера составления почты.

[self presentModalViewController:picker animated:FALSE];

и

[self dismissModalViewControllerAnimated:FALSE];

Конечно, -достаточно, он вылетел, когда «Отмена» использовалась для закрытия пользовательского интерфейса создания электронной почты.

Бегущий зомби показал это:

-[MFMailComposeController actionSheet:didDismissWithButtonIndex:]: message sent to deallocated instance 0x7479ef0

Я предполагаю, что лист действий получает сообщение об отклонении вместо контроллера представления почты.

Если кто-то может подтвердить поведение, я сообщу об ошибке.

РЕДАКТИРОВАТЬ 3 :Сообщается об ошибке.

В ответе, который я принял, есть хорошее объяснение потенциального механизма, вызывающего эту проблему.Кроме того, во время перебора комментариев к ответу были выявлены два дополнительных рабочих -обхода. Вся полоса -помогает, но теперь есть несколько вариантов.

Я еще не проверял, но подозреваю, что ShareKit также подвержен этой ошибке (, если представление контроллера представления для составления почты не анимировано ).

5
задан Community 23 May 2017 в 11:56
поделиться