0

私はUIAlertControllerです。 OKをクリックすると、MFMailComposeViewControllerと表示されます。電子メール作成画面のキャンセルボタンをタップしてMFMailComposeViewControllerを却下します。閉じるときにMFMailComposeViewControllerのデリゲートメソッドが正しく呼び出されます。 MFMailComposeViewControllerは正常に終了します。直後に同じ機能(フロー)をもう一度試してみると私は警戒を得ておらず、むしろ誤り以下になっています。理由は何でしょうか?私は、stackoverflowで利用可能なソリューションのほとんどを試してみました。それでも同じ問題が発生しています。 0x13890beb0> < MFMailComposeViewController上:< UIAlertController提示するUIAlertControllerが最初に表示され、次にMFMailComposeViewControllerが表示されます。初めての作品です

試み!0x1371ef000>ビューウィンドウ階層ではありませんが**

私はalertcontrollerとMFMailComposeViewControllerを提示するself presentViewControllerを使用しています。

サンプルコードはここにある:正確に問題を引き起こしているものを言うのは難しい

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


} 


UIAlertController * alertController= [UIAlertController alertControllerWithTitle:@"Title" message:@"message"     preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction* ok = [UIAlertAction 
         actionWithTitle:@"Ok" 
         style:UIAlertActionStyleDefault 
         handler:^(UIAlertAction * action) 
         { 
          [alertController dismissViewControllerAnimated:YES completion:nil]; 

          MFMailComposeViewController *mailComposerVC = [MFMailComposeViewController new]; 

          mailComposerVC.mailComposeDelegate = self; 

          if ([MFMailComposeViewController canSendMail]) { 


           [self presentViewController:(MFMailComposeViewController*)mailComposerVC animated: true completion: nil]; 
          } 

         }]; 
    UIAlertAction* cancel = [UIAlertAction 
          actionWithTitle:@"Cancel" 
          style:UIAlertActionStyleDefault 
          handler:^(UIAlertAction * action) 
          { 
           [alertController dismissViewControllerAnimated:YES completion:nil]; 

          }]; 

    [alertController addAction:ok]; 
    [alertController addAction:cancel]; 

    [self presentViewController:alertController animated:false completion:nil]; 
+1

あなたの質問は、該当するコードを更新します。 – rmaddy

+1

いくつかのコードを投稿してください。 SwiftまたはObjective-Cを使用しているかどうかを判断してください – FelixSFD

+1

http://stackoverflow.com/a/25864182/988769 – Kreiri

答えて

0

。いくつかの理由が考えられました。うまくいけば、そのうちの1つを解決することがあなたの問題の解決策になるでしょう。

提示コントローラではなく、提示コントローラでdismissViewControllerAnimated:に電話する必要があります。それは通常動作しますが、あなたのケースでは何かを制動する可能性があります。あなたはそれが間違っている3つの場所があります。これはそのうちの一つです:

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; // `controller` is replaces with `self` 
} 

alertControllerが却下される前に、また、あなたがmailComposerVCを提示してはなりません。このために補完ブロックを使用することができます。

シミュレータでテストしますか? MFMailComposeViewControllerが正しく動作しません。実際のデバイスで実行しようとすると、クラッシュが魔法のように消えてしまうかもしれません。

1

メールコントローラを提示するために、コードの下に使用してください:

UIAlertController * alertController= [UIAlertController alertControllerWithTitle:@"Title" message:@"message"     preferredStyle:UIAlertControllerStyleAlert]; 

UIAlertAction* ok = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
         [alertController dismissViewControllerAnimated:YES completion:nil]; 

         MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init]; 

         mailComposerVC.mailComposeDelegate = self; 

         if ([MFMailComposeViewController canSendMail]) { 

          [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:mailComposerVC 
                          animated:YES 
                          completion:nil]; 

         } 

        }]; 
UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
          [alertController dismissViewControllerAnimated:YES completion:nil]; 

         }]; 

[alertController addAction:ok]; 
[alertController addAction:cancel]; 

[self presentViewController:alertController animated:false completion:nil]; 
+0

上記のコード行はボタン操作の一部です。私の要件は、電子メールの作曲家を示す前に警告を表示することです。 – user516542

関連する問題