【问题标题】:UIDocumentInteractionController opening pdf in iBooks crashesUIDocumentInteractionController 在 iBooks 中打开 pdf 崩溃
【发布时间】:2014-07-29 17:53:37
【问题描述】:

我有一个测试 PDF 文件,我想通过我的应用在 iBooks 中打开它。我将它保存在我的临时目录中,并使用此代码将其加载到 iBooks:

NSURL *targetURL = [NSURL fileURLWithPath:tempFullPath];
NSLog(@"Path is %@", tempFullPath);
UIDocumentInteractionController *controller = [UIDocumentInteractionController interactionControllerWithURL:targetURL];
controller.delegate = self;
controller.UTI = @"com.adobe.pdf";

[controller presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES];

菜单弹出得很好,但是当我点击 iBooks 按钮时,应用程序崩溃并挂起我的 Xcode。

我在 NSLog 输出中得到的文件路径是这样的:

Path is /private/var/mobile/Applications/65EC4182-A79B-431C-9E74-BD72D91A31AB/tmp/TestFile.pdf

我做错了什么?提前致谢!

【问题讨论】:

  • 控制台显示的错误是什么?什么是堆栈跟踪?您的应用在哪里崩溃?
  • @rmaddy 应用程序在我点击UIDocumentInteractionControllerpop up 中的 iBooks 图标后立即崩溃,而我在 Xcode 中只收到 Thread 1: EXC_BAD_ACCESS (code = 1, address = blah blah) 消息。
  • 启用僵尸并查看是否正在向已释放对象发送消息。最有可能的问题是您没有保留对 UIDocumentInteractionController 的引用,因此它被释放得太快了。
  • @rmaddy 你完全正确!请根据您的评论创建一个答案,以便我接受!
  • 改变 documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL]; to documentInteractionController = [[UIDocumentInteractionController interactionControllerWithURL:fileURL] 保留];解决了我的问题。谢谢@rmaddy

标签: ios objective-c cocoa-touch ibooks uidocumentinteraction


【解决方案1】:

UIDocumentInteractionController 的使用要求您保留一个引用直到它完成。这意味着您应该使用实例变量,而不是局部变量。实现适当的委托方法,以便在使用完控制器后重置 ivar。

启用僵尸将有助于调试此类问题。您很可能会看到一条消息正在发送到已释放的对象(您的控制器)。

【讨论】:

  • 对了,把这个控制器当做UIPopoverController,一定要保留到完成!
  • @rmaddy 我该如何使用?你能推荐我吗
  • @rmaddy 的工作就像一个魅力。它的派对时间,感谢您节省我的时间。 @Vvk,只需将 UIDocumentInteractionController 的对象声明为全局而不是局部变量。然后再试一次。它对我有用。
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2011-09-03
  • 2011-07-16
相关资源
最近更新 更多