14

このような以前にいくつかの質問を見ましたが、受け入れられた回答がなく、必要に応じてすべてを実装したため、次のような問題に直面し続けています:メールコンポーザーを表示しますが、キャンセルをクリックすると、コンポーザービューがフリーズします。これは、ドラフトの保存/削除アクションシートが表示されているフレームの外に表示されているためだと思います。はい、mailComposeDelegateを現在のView Controllerに設定し、ユーザーが処理していない同様の質問をいくつか読みました。(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)errorキャンセル時に作曲家を解任するよう委任します。私もそれを処理しましたが、iPhoneバージョンのユニバーサルアプリの画面の表示領域にアクションシートが表示されない理由を一生理解できないようです。メールコンポーザーをNSLoggedとしてモーダルに表示するビューコントローラーのビューフレームは(0,0,320,480)です。私のアプリはユニバーサルで、メールコンポーザーはiPadで完璧に動作します。以下は、iPhoneSimulator5.1で実行されているコンポーザービューのスクリーンショットです。-

ここに画像の説明を入力してください
コンポーザーを表示するコードは次のとおりです。

-(IBAction)mailButtonPressed:(id)sender {

    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = self;
    [controller setSubject:@"Subject"];
    [controller setMessageBody:@"Test" isHTML:YES];
    [controller setToRecipients:nil];

    if(controller) {
        [self presentModalViewController:controller animated:YES];
        [controller release];
    }
}

- (void)mailComposeController:(MFMailComposeViewController*)controller 
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error 
{ 
    [self dismissModalViewControllerAnimated:YES];
}
4

6 に答える 6

5

コードを削除して、次のようなオンライン チュートリアルに従って再試行してみませんか。

http://iphonedevsdk.com/forum/tutorial-discussion/43633-quick-tutorial-on-how-to-add-mfmailcomposeviewcontroller.html

このような場合、作業に必要な単純な 1 行のコードを忘れがちなので、チュートリアルに従うことで、必要なコードがすべて揃っていることを確認できます。

代わりに次のコードを試してください。

- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    switch (result)
    {
        case MFMailComposeResultCancelled:
            NSLog(@"Mail cancelled");
            break;
        case MFMailComposeResultSaved:
            NSLog(@"Mail saved");
            break;
        case MFMailComposeResultSent:
            NSLog(@"Mail sent");
            break;
        case MFMailComposeResultFailed:
            NSLog(@"Mail sent failure: %@", [error localizedDescription]);
            break;
        default:
            break;
    }

    // Close the Mail Interface
    [self dismissViewControllerAnimated:YES completion:NULL];
}
于 2012-12-25T14:01:20.577 に答える
2

使用しているデバイスが何らかの理由でメールを送信できない可能性があります

あなたはこれをチェックすることができます[MFMailComposeViewController canSendMail]

于 2012-12-28T14:26:58.147 に答える
2

メッセージには、次のコード全体を使用してください。

.h

    #import <MessageUI/MFMailComposeViewController.h>
    @interface EmailViewController : UIViewController<MFMailComposeViewControllerDelegate>

.m

  -(IBAction)Email {

        MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];
            [composer setMailComposeDelegate:self];
            if ([MFMailComposeViewController canSendMail]) {
                [composer setToRecipients:[NSArray arrayWithObjects:@"contact_aaron@easy.com", nil]];
                [composer setSubject:@"Idea for Basic Calculator"];
                [composer setMessageBody:@"My idea is:" isHTML:NO];
                [composer setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
                [self presentModalViewController:composer animated:YES];

    }

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    if (error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error with message" message:[NSString stringWithFormat:@"Error %@", [error description]] delegate:nil cancelButtonTitle:@"Try Again Later!" otherButtonTitles:nil, nil];
        [alert show];
        [self dismissModalViewControllerAnimated:YES];
    }
    else {
        [self dismissModalViewControllerAnimated:YES];
    }
}
于 2012-12-28T13:24:01.043 に答える
0

自動参照カウント (ARC) を使用していないようです。メール作成コントローラーのリリースが早すぎます。解除後、解除してください。

この行を削除します: [controller release]

if(controller) {
    [self presentModalViewController:controller animated:YES];
    /// remove this: ---->  [controller release];
}

ここでこのコントローラーを離します

- (void)mailComposeController:(MFMailComposeViewController*)controller 
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error 
{ 
    [self dismissModalViewControllerAnimated:YES];

    [controller release]; // <----     add this
}
于 2012-12-29T21:06:12.587 に答える
0

これを適用します

-(void)displayComposerSheet

if(composer != nil) {

    [composer release];

    composer = nil;

}

このオブジェクトに値を与えた後

[picker composer];
于 2012-12-29T12:36:37.257 に答える
0

これを(すべての)UIViewControllersに追加して、iPhoneまたはメモリが不足しているかどうかを確認します。つまり、mailComposerSheet がベースの viewController をリリースしたため、mailComposerDelegate は nil です。

- (void)didReceiveMemoryWarning
{
  NSLog(@"didReceiveMemoryWarning");
  [super didReceiveMemoryWarning];
}
于 2012-12-30T00:46:28.890 に答える