MFMailComposeViewController 不会出现在 iOS8

MFMailComposeViewController won't appear in iOS8

我有一个 objective C 程序,它有一个带有日期列表的弹出窗口和两个按钮 "Done" 和 "Cancel"。当用户点击一个日期然后点击完成按钮时,弹出窗口应该会消失,并且应该会出现一个填充了该日期数据的 MFMailViewController window。

当我 运行 iPad 上的程序 iOS 7 时,一切正常 - 弹出窗口消失,邮件视图出现并填充了数据。当我 运行 它在 iPad 和 iOS 8.1 上时,弹出窗口消失但邮件视图没有出现。

使用 NSLog 输出,我知道 iPad 可以发送电子邮件,正确的日期到达方法,MFMailViewController 对象确实存在,并且它越过了应该显示控制器的行.但是控制器没有出现

我们将不胜感激,因为大量的网络搜索都没有找到任何帮助。

方法的结尾是:

NSLog(@"about to present the mail view");
if ([MFMailComposeViewController canSendMail] == YES){
    NSLog(@"can it email YES");
}
else {
    NSLog(@"can it email NO");
}
NSLog(@"the picker is %@",picker);
[self presentViewController:picker animated:NO completion:NULL];
NSLog(@"leaving method EmailDataFiles");

此代码的输出是:

about to present the mail view
can it email YES
the picker is <MFMailComposeViewController: 0x1616ac00>
leaving method EmailDataFiles

我不知道你是如何初始化选择器对象的,但这对我有用,放在你的 if 条件中:

if ([MFMailComposeViewController canSendMail] == YES){
    NSLog(@"can it email YES");
    MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];

    mailViewController.mailComposeDelegate = self;
    [mailViewController setSubject:@"Subject"];
    [mailViewController setMessageBody:@"" isHTML:NO];
    mailViewController.modalPresentationStyle = UIModalPresentationFormSheet;

    [self presentModalViewController:mailViewController animated:YES];
}

我认为这是一个竞争条件.. popoverController 的 doneButton-action 上的 dismissPopover 和选择器的 presentViewController 发生冲突..

如果以下选项适合您,您可以试试吗?

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self presentViewController:picker animated:NO completion:NULL];
    });