我正在尝试使用UIDocumentInteractionController OpenIn菜单将我的应用中生成的图像发送到其他应用。我用这段代码将UIImage保存到磁盘:
fileJpeg = [NSTemporaryDirectory() stringByAppendingPathComponent:@"activeImage.jpg"];
jpegFileURL = [NSURL fileURLWithPath:fileJpeg];
UIImage *imageToWrite = image;
[UIImageJPEGRepresentation(imageToWrite, 1.0) writeToFile:fileJpeg atomically:YES];
我正在使用另一种方法访问jpegFileURL以使用MFMailComposeViewController通过电子邮件发送图像,并且它工作正常,因此NSURL是有效的。但是当我尝试将图像发送到另一个应用程序(只是发送,我没有实现任何预览功能)时,应用程序崩溃了。这是方法:
- (IBAction)openInOtherApp:(id)sender{
UIDocumentInteractionController *controller = [UIDocumentInteractionController interactionControllerWithURL: jpegFileURL];
controller.delegate = self;
CGRect rect = self.view.frame;
[controller presentOpenInMenuFromRect:rect inView:self.view animated:YES];
}
显示“打开方式”菜单。当我点击任何可用应用程序的按钮时,它会崩溃。在iOS6(6.0.1)和iOS5(5.1.1)设备上测试时,我在控制台中没有输出错误(只是通常的EXC_BAD_ACCESS(代码= 1,地址...崩溃),但是在iOS 4.3设备上(应用程序是4.3向上兼容)我在控制台中收到此错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType actionSheet:clickedButtonAtIndex:]: unrecognized selector sent to instance 0x16b7f0'
我一直在阅读关于UIDocumentInteractionController和UIDocumentInteractionControllerDelegate的Apple文档,我在我的类@interface中实现,但似乎不需要任何可选的委托方法来满足我的需求或在此崩溃中有所帮助。
无法确定错误或遗失的内容。任何帮助将不胜感激。
答案 0 :(得分:35)
发现问题,感谢this answer。这是记忆的事情。我使用UIDocumentInteractionController作为本地实例变量,ARC很快将其释放。把它变成了一个类属性,现在一切正常。
答案 1 :(得分:2)
你必须在@interface之后在你的.h文件中定义UIDocumentInteractionController * controller ... 喜欢
@interface sampleView <UIDocumentInteractionControllerDelegate>
{
UIDocumentInteractionController *controller;
}
应用程序需要从整个模块访问此变量,而不仅仅是在调用它的过程中。
答案 2 :(得分:0)
请注意,如果您使用远程PDF网址,则应用程序将崩溃!将远程URL保存到本地目录路径。并将该URL指向文档交互控制器。在此处保存到本地目录的Swift代码示例。
let data = try Data(contentsOf: self.pdfUrl)
// Create a local file url path with intermediate folders created.
let fileUrl = Utils.cachesDirectoryPath(appendingComp: self.filePath, ext: "pdf")
try data.write(to: fileUrl)
// Provide this URL into DocumentInteractionController
self.fileUrl = fileUrl