我很乐意通过电子邮件分享我的iOS 6.0应用的自定义内容。
但由于我的内容需要一些时间才能分享,所以当用户按下“共享”按钮时,我无法立即显示邮件撰写视图。不幸的是,MFMailComposeViewController从一开始就需要所有附件,所以我必须等待附件才能初始化并显示MFMailComposeViewController(就像它在这里建议的那样:UIActivityView attach file to Email)
- 阅读Sapan的答案后编辑:我正在寻找的是像UIActivityViewController这样的行为,例如必须创建的视频文件:用户按下共享按钮,UIActivityController立即显示。附件是在后台创建的,创建不会中断用户的体验。 -
我尝试了UIActivityViewController,它具有很好的异步UIActivityItemProvider功能,但不幸的是,这似乎只适用于具有公共mime类型(如图像和视频)的附件。我的自定义NSData“项目”不仅被忽略,不仅是为了在Facebook上分享(这非常有意义),而且还用于电子邮件共享。或者我在这里做错了什么:
MyUIActivityItemProvider *myCustomDocProvider = [[MyUIActivityItemProvider alloc] initWithPlaceholderItem:[[NSData alloc]init] andCustomInfoToCreateNSDataFrom:customAppInfo];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[myTextString, myCustomDocProvider] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];
我已经在考虑创建自己的自定义电子邮件编辑器视图,这样我就可以在用户输入时/之后在后台创建附件。但我不想。我喜欢我在HIG中读到的“UI元素的一致性”的想法。
我该怎么办?
答案 0 :(得分:1)
您可以按如下方式创建方法,然后使用[self performSelectorInBackground:@selector(sendMail)];
-(void) sendMail
{
// Prepare the data
// Attach the data
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
[picker addAttachmentData:myData mimeType:@"<YOUR-MIME-TYPE>" fileName:@"Filename"];
// Show compose view controller on the main thread
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Fill out the email body text
NSString *emailBody = @"Body";
[picker setMessageBody:emailBody isHTML:NO];
[self presentModalViewController:picker animated:YES];
});
}
答案 1 :(得分:0)
您可以执行的操作是将邮件正文设置为HTML,其中包含从远程服务器引用的图像或媒体。然后,用户将在邮件撰写视图中看到损坏的图像(也许您可以使用一些聪明的HTML隐藏它),但在收到邮件时,应该完成上传。
不是最佳的,因为它在发送电子邮件后可能会失败,但可能是您最好的选择。
答案 2 :(得分:0)
这可以通过在myCustomDocProvider中使用布尔值来保存项目的返回,直到文件的构建完成。如果要显示进度或在主视图上显示活动指示器,可以通过从主线程调用它来执行此操作。以下是此操作的代码段:
使用此功能在提供程序中设置活动视图控制器,以便加载进度视图。
self.parentViewController = parentVc;
这是具有阻止和反馈视图加载的项目功能。
self.wait = true;
[self prepareFile:^(){
[self performSelectorOnMainThread:@selector(dismissProgressView)
withObject:nil waitUntilDone:NO];
}];
[self performSelectorOnMainThread:@selector(loadProgressView)
withObject:nil waitUntilDone:NO];
while (self.wait) {
[self performSelectorOnMainThread:@selector(updateProgressView)
withObject:nil waitUntilDone:NO];
}
return self.completedUrl;
然后,您可以创建在主线程上调用的三个函数以显示进度视图,在等待文件完成时更新进度视图。在dismissProgressView函数的实现中,确保在dismissViewController完成时将wait boolean设置为false。