Swift 中的 UIDocumentInteractionControllerDelegate EXC_BAD_ACCESS

UIDocumentInteractionControllerDelegate EXC_BAD_ACCESS in Swift

我目前正在尝试使用另一个使用 UIDocumentInteractionController 实例的应用程序打开一个文件。一切正常(例如显示选项对话框,打开应用程序)但是当应用程序切换实际发生时我收到一个 EXC_BAD_ACCESS 而不是 didFinishSendingToApplication: 委托回调。在我将此代码从 Objective-C 移植到 Swift 之前,一切正常。 知道这里出了什么问题吗?

self.documentInteractionController = UIDocumentInteractionController(URL: self.fileURL)
self.documentInteractionController!.UTI = "net.whatsapp.movie"
self.documentInteractionController!.delegate = self

这是我能得到的所有堆栈跟踪(崩溃实际上发生在主函数中,所以我无法得到更多...):

* thread #1: tid = 0x12ef7e, 0x0000000182dd18c8 CoreFoundation`CFStringCreateCopy + 36, queue = 'com.apple.main-thread', stopreason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x0000000182dd18c8 CoreFoundation`CFStringCreateCopy + 36
frame #1: 0x0000000101df09d8 libswiftCore.dylib`function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Dead> of Swift.String.init (Swift.String.Type)(_cocoaString : Swift.AnyObject) -> Swift.String + 108
frame #2: 0x0000000101dd45b0 libswiftCore.dylib`Swift.String.init (Swift.String.Type)(_cocoaString : Swift.AnyObject) -> Swift.String + 24
frame #3: 0x0000000100253814 MyApp`@objc MyApp.MyViewController.documentInteractionController (MyApp.MyViewController)(ObjectiveC.UIDocumentInteractionController, didEndSendingToApplication : Swift.String) -> () + 84 at MyViewController.swift:0
frame #4: 0x0000000183dedf9c Foundation`__NSThreadPerformPerform + 372
frame #5: 0x0000000182ea4240 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
frame #6: 0x0000000182ea34e4 CoreFoundation`__CFRunLoopDoSources0 + 264
frame #7: 0x0000000182ea1594 CoreFoundation`__CFRunLoopRun + 712
frame #8: 0x0000000182dcd2d4 CoreFoundation`CFRunLoopRunSpecific + 396
frame #9: 0x000000018c5e36fc GraphicsServices`GSEventRunModal + 168
frame #10: 0x0000000187992fac UIKit`UIApplicationMain + 1488
frame #11: 0x00000001000c6374 MyApp`main(argc=1, argv=0x000000016fdf79c0) + 124 at main.m:33
frame #12: 0x0000000194d8ea08 libdyld.dylib`start + 4

我遇到了同样的问题并花了几天时间尝试解决这个问题。

我终于发现这个错误的根本原因是在 class.

中实现 func documentInteractionController(controller: UIDocumentInteractionController, didEndSendingToApplication application: String)

我删除了此功能并改用 willBeginSendingToApplication,应用程序不会在应用程序切换时崩溃。

在真实设备上测试 运行 iOS 7.1 和 iOS 8.3。仅供参考

真正的问题是SDK上的委托签名错误。代替

documentInteractionController(controller: UIDocumentInteractionController, didEndSendingToApplication application: String)

你应该使用

documentInteractionController(controller: UIDocumentInteractionController, didEndSendingToApplication application: String?)

请不要最后一个 ?,它说应用程序参数可以是 nil,它总是这样。

您应该对 willBeginSendingToApplication 调用执行相同的操作,因为它也可以有一个 nil 应用程序参数。

可以安全地忽略抱怨与协议预期不同的可选性的警告。