在 MFMailComposeViewController 实现中崩溃

Crashing in MFMailComposeViewController implementation

当我尝试在 MFMailComposeViewController 中执行发送或取消按钮操作时,我的应用程序崩溃了。

这是我的代码。 我在 .h 文件中导入了消息框架并添加了委托。

     NSString *emailTitle = @"Test Email";

                NSString *messageBody = @"Welcome Guest";

                NSArray *recipentsArray = [[NSArray alloc]initWithObjects:@"xxx@gmail.com", nil];
            [[UINavigationBar appearance] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

             [[UINavigationBar appearance] setBackgroundColor:nil];
                MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];

                mc.mailComposeDelegate = self;

                [mc setSubject:emailTitle];

                [mc setMessageBody:messageBody isHTML:NO];

                 [mc setToRecipients:recipentsArray];

                [self presentViewController:mc animated:YES completion:NULL];(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];
    }

这就是我的 mf 邮件编辑器的样子:----

只需将 MFMailComposeViewController *mc 设为全局即可。 我的意思是在这个方法之外声明它。它正在崩溃,因为在方法结束时你的 mc 被释放。

界面

@interface Demo()
{
   MFMailComposeViewController *mc;
}
@end

实施

-(void)ShareViaEmail {

objMailComposeController = [[MFMailComposeViewController alloc] init];
objMailComposeController.mailComposeDelegate = self;

if ([MFMailComposeViewController  canSendMail]) {

    [objMailComposeController setSubject:@"Hello"];
    [objMailComposeController setMessageBody:@"This is Body of Message" isHTML:NO];

        NSData *ImageData = [NSData dataWithContentsOfFile:self.aStrSourceName];
        NSString *mimeType;

        if ([[self CheckExtensionOfURL:self.aStrSourceName]isEqualToString:@"Image"]) {
            mimeType = @"image/png";
        }
        else if ([[self CheckExtensionOfURL:self.aStrSourceName]isEqualToString:@"PDF"]) {
            mimeType = @"application/pdf";
        } else if ([[self CheckExtensionOfURL:self.aStrSourceName]isEqualToString:@"Audio"]) {
            mimeType = @"audio/mpeg";
        } else if ([[self CheckExtensionOfURL:self.aStrSourceName]isEqualToString:@"Video"]) {
            mimeType = @"video/mp4";
        }


        [objMailComposeController addAttachmentData:ImageData mimeType:mimeType fileName:@"attachement"];

    }
    [self.navigationController presentViewController:objMailComposeController animated:YES completion:Nil];

}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {

switch (result) {
    case MFMailComposeResultCancelled:
        [self ShowAlertView:kMsgMailCancelled];
        break;

    case MFMailComposeResultFailed:
         [self ShowAlertView:kMsgMailFailed];
        break;

    case MFMailComposeResultSaved:
         [self ShowAlertView:kMsgMailSaved];
        break;

    case MFMailComposeResultSent:
         [self ShowAlertView:kMsgSent];
        break;
    default:
        break;
}

// CHECK OUT THIS, THIS MIGHT BE IN YOUR CASE
[self.navigationController dismissViewControllerAnimated:controller completion:nil];


}