2016-05-04 9 views
0

iPadがクラッシュしたため、私のiPhoneアプリはTestFlightで拒否されました。問題のコードは、電子メールを送信するためのコントローラを表示しようとしています。presentViewControllerがiPadではクラッシュしますが、iPhoneではクラッシュしません

- (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]; 
} 

エラーメッセージは次のとおりです:

私は、iOS 9.3.1実行している私のiPhone 5cの上で期待通りに動作しますが、私のiPad 2を実行しているのiOS 9.3.1クラッシュ小さな、簡単な例にコードを削減しました

***キャッチされていない例外 'NSInvalidArgumentException'が原因でアプリケーションを終了しています。理由: 'アプリケーションがターゲットにnilモーダルビューコントローラを表示しようとしました。'

私はこれを理解するのに少し時間を費やしましたが、それを解決できませんでした。どんなアイデアや提案も大歓迎です!

+0

'picker'は' nil'ですか? 'MFMailComposeViewController'のドキュメントを読んでください。このクラスを使用する前に、デバイスが電子メールを送信できるかどうかを確認する必要があります。 – rmaddy

答えて

0

電子メールを送信するには、デバイスに定義された電子メールアカウントが必要です。アカウントが設定されていない場合、MFMailComposeViewControllerは問題を発生させ、クラッシュします。

canSendMailメソッドを使用して電子メールを送信できることを確認することをお勧めします。

if ([MFMailComposeViewController canSendMail]) 
    [self presentViewController:picker animated:YES completion:nil]; 
+0

'displayComposerSheet'メソッドの全内容は' if'ステートメントの内側にあるべきです。デバイスが電子メールを送信できない場合、 'MFMailComposeViewController'インスタンスを作成して設定する必要はありません。 – rmaddy