14

我之前已经看到过几个问题,但是由于缺乏可接受的答案以及根据需要实施了所有内容,我仍然继续面临以下问题:我显示邮件编写器,但单击取消时,编写器视图冻结. 我认为这是由于保存/删除草稿操作表出现在可见框架之外。是的,我已将 mailComposeDelegate 设置为呈现视图控制器,并阅读了用户尚未处理的几个类似问题(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error代表在取消时解雇作曲家。我也处理过这个问题,但我似乎一辈子都无法弄清楚为什么在我的通用应用程序的 iPhone 版本中,操作表不会出现在屏幕的可见区域中。以 NSLogged 模态显示邮件编写器的视图控制器的视图框架是 (0,0,320,480)。我的应用程序是通用的,邮件编辑器在 iPad 上完美运行。下面是在 iPhone Simulator 5.1 上运行的 composer 视图的截图:-

在此处输入图像描述
这是显示 composer 的代码:

-(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

在这种情况下,您总是会忘记工作所需的一行简单代码,因此遵循教程可以帮助我确保所有必要的代码都在那里。

试试这个代码:

- (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 回答