MFMailComposeViewController で presentModalViewController できない


データのエクスポートなどでメール送信を利用する場合、 MFMailComposeViewControllerを使ってメール送信画面を開く前に、何かデータオプションを選択する別のModalViewを開くということはよくあるのではないかと思う。それで、送信画面を表示する直前に、そのModalViewを閉じる。例えば以下のような形。

[self dismissModalViewControllerAnimated:YES];
if ([MFMailComposeViewController canSendMail]) {
  MFMailComposeViewController* mail = [[MFMailComposeViewController alloc] init];
  mail.mailComposeDelegate = self;
  [mail setSubject:title];
  [self presentModalViewController:mail animated:YES];
  [mail release];
}

しかし、上記のような場合なぜか、presentModalViewController が全く無反応になった。
半日くらい悩んだが、やっと答えを見つけた。以下のページ。

presentModalViewController crashes my app

他のModalViewを dismissした直後は 0.45くらいの遅延を入れてやる必要があるらしい。performSelector を使う。

[self dismissModalViewControllerAnimated:YES];
[self performSelector:@selector(sendEmail:) withObject:title afterDelay:0.45];

そして sendEmail を用意してあげる。

– (void)sendMail:(NSString*)title
{
  if ([MFMailComposeViewController canSendMail]) {
    MFMailComposeViewController* mail = [[MFMailComposeViewController alloc] init];
    mail.mailComposeDelegate = self;
    [mail setSubject:title];
    [self presentModalViewController:mail animated:YES];
    [mail release];
  }
}

これで解決した。

広告