MFMailComposeViewControllerをセットアップしましたが、iPhoneでは問題なく動作しますが、iPadでは次のようにクラッシュします。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target...
では、なぜこれがnilモーダルビューを作成するのでしょうか?
MFMailComposeViewController *message = [[MFMailComposeViewController alloc] init];
[message setMessageBody:@"My message here" isHTML:NO];
[message setToRecipients:[NSArray arrayWithObject:@"[email protected]"]];
[message setSubject:@"Request Info"];
message.mailComposeDelegate = self;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
message.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:message animated:YES];
[message release];
何か案は?
MFMailComposeViewController
のようなLoosは何らかの理由で作成されなかったため、nil
の値があります。表示する前に、それがnilであるかどうかを確認してください(ただし、この回避策では、ここで問題が発生したことには答えられません...)。
また、+canSendMail
メソッドを使用してメールを作成および提示する前に、メールcomposerがメールを送信できるかどうかを確認する必要があります(たとえば、デバイスにメールアカウントが設定されていない場合はNOが返されます)。 )::
if ([MFMailComposeViewController canSendMail]){
// Create and show composer
}
else{
// Show some error message here
}
canSendMail
オブジェクトを作成する前に、MFMailComposerViewController
をチェックする必要があります。MFMailComposeViewController.h
クラス:
/*!
@method canSendMail
@abstract Returns <tt>YES</tt> if the user has set up the device for sending email.
@discussion The client may continue to set the recipients and content if the return value was <tt>YES</tt>. If <tt>NO</tt>
was the result, the client has a couple options. It may choose to simply notify the user of the inability to
send mail, or it may issue a "mailto" URL via <tt>-[UIApplication openURL:]</tt>.
*/
+ (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
デバイスがメールを送信するように設定されるまで、オブジェクトは初期化されません。
if ([MFMailComposeViewController canSendMail]){
//execute your code
else{
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert addButtonWithTitle:@"OK"];
[anAlert show];
}
アラートが表示された場合は、電話でメールアカウントを構成してください。
IOSのデフォルトのメールアプリがまだメールIDで構成されていないために発生します。したがって、任意のメールIDで構成して試してください。
このような
if ([MFMailComposeViewController canSendMail]){
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setToRecipients:[NSArray arrayWithObject:eMail]];
[self presentViewController:controller animated:YES completion:nil];
}
else{
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert addButtonWithTitle:@"Cancel"];
[anAlert show];
}
それがあなたの助けになることを願っています。