PresentViewController аварийно завершает работу с iPad, но не с iPhone

Мое приложение для iPhone было отклонено TestFlight, потому что оно привело к сбою iPad. Код нарушения пытается показать контроллер для отправки электронной почты. Я сократил код до небольшого простого примера, который работает, как и ожидалось, на моем iPhone 5c под управлением iOS 9.3.1, но вызывает сбой на моем iPad 2 под управлением iOS 9.3.1:

- (void)viewDidLoad {
  [super viewDidLoad];
  [self displayComposerSheet];
}

-(void)displayComposerSheet {
  // Create e-mail interface
  MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
  picker.mailComposeDelegate = self;
  [picker setSubject:@"iPad crash test"];

  // Add recipients
  NSArray *toRecipients = [NSArray arrayWithObject:@"[email protected]"];
  [picker setToRecipients:toRecipients];

  // Fill body
  NSString *emailBody = @"A short test of iPad crashes";
  [picker setMessageBody:emailBody isHTML:NO];

  // Show interface - iPad crashes here but iPhone is ok
  [self presentViewController:picker animated:YES completion:nil];
}

Сообщение об ошибке:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение пыталось представить нулевой контроллер модального представления на цели».

Я потратил немного времени, чтобы понять это, но не смог разобраться. Любые идеи или предложения будут с благодарностью!


person hitlad    schedule 04.05.2016    source источник
comment
Является ли picker nil? Прочтите документацию для MFMailComposeViewController. Вам нужно проверить, может ли устройство отправлять электронную почту, прежде чем пытаться использовать этот класс.   -  person rmaddy    schedule 04.05.2016


Ответы (1)


Для отправки электронной почты на устройстве должна быть определена учетная запись электронной почты. Если учетная запись не настроена, MFMailComposeViewController создаст проблему и произойдет сбой.

Лучше проверить, может ли ваше устройство отправлять электронную почту с помощью метода canSendMail.

if ([MFMailComposeViewController canSendMail])
    [self presentViewController:picker animated:YES completion:nil];
person berkuqo    schedule 04.05.2016
comment
Все содержимое метода displayComposerSheet должно находиться внутри оператора if. Нет причин даже создавать и настраивать экземпляр MFMailComposeViewController, если устройство не может отправлять электронную почту. - person rmaddy; 04.05.2016