MFMailComposeViewController
からUITableViewController
を呼び出しています。問題は、メール作成ウィンドウでCancelまたはSendボタンを選択したときにデリゲートメソッドが呼び出されないことです。
mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult
これがテーブルビュークラスです。
@implementation DetailsTableViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section==0 && indexPath.row==4) {
//SEND MAIL
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
if ([MFMailComposeViewController canSendMail]) {
[controller setSubject:[NSString stringWithFormat:@"Ref %@",[item objectForKey:@"reference"]]];
[controller setMessageBody:@" " isHTML:NO];
[controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
[self presentModalViewController:controller animated:YES];
}
[controller release];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
// NEVER REACHES THIS PLACE
[self dismissModalViewControllerAnimated:YES];
NSLog (@"mail finished");
}
アプリケーションはクラッシュしません。 [キャンセル]または[送信]ボタンが押された後、作成ウィンドウはボタンが無効な状態で画面に残ります。 Homeキーを押すとアプリケーションを終了できます。
TableViewから他のモーダルビューを開くことはできますが、MailComposeを開くことはできません。
必ず使用してください
controller.mailComposeDelegate = self;
ではなく
controller.delegate = self;
メソッドの署名が正しくありません:
- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
する必要があります:
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
完全な実装については、この記事を参照してください。 http://www.ioscreator.com/tutorials/send-email-from-an-app
非推奨のものを削除した後の作業コード:
#import <MessageUI/MFMailComposeViewController.h>
@interface SettingsTableViewController () <MFMailComposeViewControllerDelegate, UITextFieldDelegate, UITextViewDelegate>
@end
@implementation SettingsTableViewController
// add default methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger sectionNum = indexPath.section;
NSInteger rowNum = indexPath.row;
if (sectionNum == 2 && rowNum == 1) {
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
if ([MFMailComposeViewController canSendMail]) {
[controller setSubject:[NSString stringWithFormat:@"Invitation to Northstar app"]];
[controller setMessageBody:@" " isHTML:NO];
// [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
//presentViewController:animated:completion:
[self presentViewController:controller animated:YES completion:NULL];
}
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
NSLog (@"mail finished");
[self dismissViewControllerAnimated:YES completion:NULL];
}
@end
私は同じ問題に直面し、過去2日間の修正を検索していたところ、自分で修正を見つけました。
私の場合、MFMailComposeViewController
を表示していたところからのビューコントローラ(この質問では「DetailsTableViewController」など)は、他のビューコントローラ(たとえば、「BaseViewController」)からすでに表示されています。
問題は、BaseViewControllerから提示されている間、「DetailsTableViewController」の「modalPresentationStyle
」にありました。
それを「UIModalPresentationFormSheet
」から「UIModalPresentationPageSheet
」に変更した瞬間(つまり、「UIModalPresentationFormSheet
」以外の問題)の問題が解決され、メールコントローラのデリゲートメソッドが起動し始めましたいつものように。
注:(この例では) 'DetailsTableViewController'で以下のメソッドを既に呼び出していたため、どの 'modalPresentationStyle
'を使用しているかは問題ではありませんでした。
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
self.view.superview.bounds = CGRectMake(0, 0, 1024, 768);
self.view.superview.backgroundColor = [UIColor clearColor];
}