web-dev-qa-db-ja.com

MFMailComposeViewControllerを閉じることができません。デリゲートが呼び出されていません

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を開くことはできません。

49
Rod

必ず使用してください

controller.mailComposeDelegate = self;

ではなく

controller.delegate = self;
214
mxg

メソッドの署名が正しくありません:

- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error

する必要があります:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
14
Chris Gummer

完全な実装については、この記事を参照してください。 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
4
Rajeev

私は同じ問題に直面し、過去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];
}
0
Rajesh