我正在尝试将MFMailComposeViewController
合并到我的应用中。当我以模态方式呈现它时,发送按钮工作正常并且发送电子邮件,这意味着在这种情况下发送给代表的结果是正确的。
然后,当我点按取消按钮时,它会挂断应用程序。日志也没有显示错误,只是屏幕变暗,一切都被禁用。显然,结果没有传递给委托(我通过日志检查)。它似乎是
(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
每当按下取消按钮时,都不会调用。可能这就是为什么没有显示动作表(保存草稿,取消,删除草稿)的原因,因此应用程序就会挂起。< / p>
我正在使用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]];
}
答案 0 :(得分:7)
方法
(void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error
永远不会被调用,因为您在取消后没有按任何UIActionSheet
按钮,因为它没有在屏幕上显示。
发生这种情况的原因是UIActionSheet
出现在屏幕外。如果您检查调试日志,您可能会看到一条消息,指出显示由其超级视图剪切的操作表。某些控件可能无法响应触摸。在iPhone上尝试-[UIActionSheet showFromTabBar:]
或-[UIActionSheet showFromToolbar:]
而不是-[UIActionSheet showInView:]
。“
这就是为什么你看到你的视图变暗,但没有出现UIActionSheet
。
在我的情况下,问题是我的应用程序是通用的,但由于某种原因,只有一个MainWindow.xib
,它大于iPhone的屏幕尺寸(事实上,它是iPad的屏幕尺寸)。
解决方案是创建具有正确尺寸的另一个MainWindow-iPhone.xib
并更改名为主nib文件库(iPad)和主nib文件库(iPhone)的Info.plist条目)以便他们指向正确的文件。问题解决了!
希望它有所帮助。
答案 1 :(得分:1)
我有同样的问题,评论'[picker release];'
,它运行良好!说明?我没有。
答案 2 :(得分:1)
Msoler说得对,行动表显示在屏幕外。 MFMailComposeViewController在x:y 0:0显示操作表,因此您必须确保调用控制器帧为0:0。当我试图从嵌入滚动视图的视图中显示MFMailComposeViewController时,我遇到了类似的问题。
答案 3 :(得分:0)
我已经实现了相同的代码。它工作得非常好。单击删除草稿按钮时,将调用didFinishWithResult方法并取消邮件。
答案 4 :(得分:0)
确保使用正确的方法,
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
我有一些从未调用的类似方法。我不知道我到底有什么,但编译器没有给我一个警告或错误信息。
答案 5 :(得分:0)
以防其他人犯同样的错误......我在Swift代码中实现了mailComposeController:didFinishWithResult:error:
方法。它工作了一段时间,但经过几次重构后,我注意到它突然不再被调用了。最后我注意到该方法在我的代码中采用了这种形式:
private func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}
因此,正如您所看到的,我对我的方法私有化有点过于渴望:由于该方法在@optional
中标记为MFMailComposeViewControllerDelegate
,因此您无需实现它。虽然我实际上已经实现了它,但是那里的private
修饰符隐藏了实现 - 因此,从文件外部看来该方法实际上根本没有实现!但是,由于该方法是可选的,编译器没有抱怨...
总结:不要使用修饰符private
标记可选委托。
自从学习Swift以来为什么没有可选方法以来我一直在想 - 现在我可能已经理解了; - )。