点击MFMailComposeViewController的取消按钮时,不显示操作表

Ana*_*nam 4 iphone objective-c ios4

我正试图加入MFMailComposeViewController我的应用程序.当我以模态方式呈现它时,发送按钮工作正常并且发送电子邮件,这意味着在这种情况下发送给委托的结果是正确的.

而当我点击取消按钮时它会挂起应用程序.日志也没有显示错误,只是屏幕变暗,一切都被禁用.显然,结果没有传递给委托(我通过日志检查).它似乎是

(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
Run Code Online (Sandbox Code Playgroud)

每次按下取消按钮时都不会调用.可能这就是为什么没有显示动作表(保存草稿,取消,删除草稿)的原因,因此应用程序就在那里挂起.

我正在使用Apple的示例应用程序(MailComposer)中的确切代码,它在那里工作得很好,但在某种程度上我的失败.:(

如果有人遇到同样的问题并成功解决了,请帮助我.

我的代码:

  -(IBAction)emailButtonPressed:(id)sender{

           Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
       if (mailClass != nil)
          {

          if ([mailClass canSendMail])
            {
              [self displayComposerSheet];
            }
          else
            {
              [self launchMailAppOnDevice];
            }
          }
        else
          {
            [self launchMailAppOnDevice];
          }


}


#pragma mark -
#pragma mark Compose Mail


-(void)displayComposerSheet 
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"Ilusiones"];


    // Set up recipients
     NSArray *toRecipients = [NSArray arrayWithObject:@"anam@semanticnotion.com"]; 

     [picker setToRecipients:toRecipients];
     // Attach a screenshot to the email      
     UIGraphicsBeginImageContext(self.view.bounds.size);
     [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
     UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

         NSData *myData = UIImagePNGRepresentation(viewImage);
     [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"viewImage"];



     // Fill out the email body text
     NSString *emailBody = @"";
     [picker setMessageBody:emailBody isHTML:NO];

     [self presentModalViewController:picker animated:YES];
         [picker release];

 }

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

  switch (result)
  {
case MFMailComposeResultCancelled:
    NSLog(@"Result: canceled");
    break;
case MFMailComposeResultSaved:
    NSLog(@"Result: saved");
    break;
case MFMailComposeResultSent:
    NSLog( @"Result: sent");
    break;
case MFMailComposeResultFailed:
    NSLog( @"Result: failed");
    break;
default:
    NSLog(@"Result: not sent");
    break;
 }
 [self dismissModalViewControllerAnimated:YES];
}


#pragma mark -
#pragma mark Workaround


-(void)launchMailAppOnDevice
{
NSString *recipients = @"mailto:anam@semanticnotion.com.com?cc=second@example.com,third@example.com&subject=illusions!";
NSString *body = @"&body=xyz";

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}
Run Code Online (Sandbox Code Playgroud)

mso*_*ler 7

方法

(void)mailComposeController:(MFMailComposeViewController*)controller
        didFinishWithResult:(MFMailComposeResult)result
                      error:(NSError*)error
Run Code Online (Sandbox Code Playgroud)

永远不会被调用,因为你UIActionSheet在取消后没有按任何按钮,因为它没有在屏幕上显示.

发生这种情况的原因是UIActionSheet屏幕外显示.如果您检查调试日志,您可能会看到一条消息,说明由其超级视图剪切的演示操作表.某些控件可能无法响应触摸.在iPhone上尝试-[UIActionSheet showFromTabBar:]-[UIActionSheet showFromToolbar:]代替-[UIActionSheet showInView:]."

这就是为什么你看到你的视野越来越暗,但没有UIActionSheet出现.

在我的情况下,问题是我的应用程序是通用的,但由于某种原因,只有一个MainWindow.xib,它比iPhone屏幕大小(事实上,它是iPad屏幕大小).

解决方案是创建MainWindow-iPhone.xib具有正确尺寸的另一个,并更改名为主nib文件库(iPad)主nib文件库(iPhone)的Info.plist条目,以便它们指向正确的文件.问题解决了!

希望能帮助到你.