UIDocumentInteractionController 总是失败

UIDocumentInteractionController always fails

我正在尝试使用 UIDocumentInteractionController。我已经检查了所有我能想到的东西,所有东西似乎都有所需的所有数据。

调用 presentOpenInMenuFromRect(inView:, animated:) 时,returned 的 Bool 始终为假。我的理解是,这是因为没有任何应用程序支持 UTI。我试过使用扁平化的 PNG,但仍然一无所获。有趣的是为什么它不能在我的 iPhone 上运行,它有很多应用程序支持通过 UIDocumentInteractionController 加载图像,但这里是关键。在我将项目升级到 Swift 1.2 之前,这段代码运行良好。

我现在是不是忽略了什么?我检查了文档,找不到任何我遗漏的东西。

注意:我已经在设备和模拟器中对此进行了测试,两者 return 相同。

let image = UIImage(named: "screenshot")

        if let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) {
            if paths.count > 0 {
                if let dirPath = paths[0] as? String {
                    let path = dirPath.stringByAppendingPathComponent("screenshot.ig") // igo


                    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), { () -> Void in
                        if let image = image {
                            NSFileManager.defaultManager().removeItemAtPath(path, error: nil)
                            if UIImagePNGRepresentation(image).writeToFile(path, atomically: true) {

                            }
                        }
                    })

                    if let url = NSURL(fileURLWithPath: path) {
                        let documentController = UIDocumentInteractionController(URL: url)
                        documentController.UTI = "com.instagram.photo" // com.instagram.exclusivegram
                        documentController.annotation = ["InstagramCaption": ""]
                        if !documentController.presentOpenInMenuFromRect(sender.bounds, inView: self.view, animated: true) {
                            println("Can't do it")
                        }
                    }
                }
            }
        }

问题是您在后台队列上异步写入文件,但在打开交互控制器之前不要等待。所以当它试图打开你的文件时,它找不到它,因为它还没有被写入。您需要让写操作成功,然后尝试打开交互控制器。

像这样更改您的代码:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), { () -> Void in
    if let image = image {
        NSFileManager.defaultManager().removeItemAtPath(path, error: nil)
        if UIImagePNGRepresentation(image).writeToFile(path, atomically: true) {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                if let url = NSURL(fileURLWithPath: path) {
                    let documentController = UIDocumentInteractionController(URL: url)
                    documentController.UTI = "com.instagram.photo" // com.instagram.exclusivegram
                    documentController.annotation = ["InstagramCaption": ""]
                    if !documentController.presentOpenInMenuFromRect(sender.bounds, inView: self.view, animated: true) {
                        println("Can't do it")
                    }
                }
            }
        }
    }
})

我决定使用 presentOptionsMenuFromRect(:, inView:, animated:),它可以完成我想要完成的任务。不知道为什么 presentOpenInMenuFromRect(: inView:, animated:) 决定崩溃,但我确实设法让一切正常运转。

我在开箱即用的 iPad 上遇到了同样的问题。我无法打开 txt 或 png 文件(我 运行 的两个测试)。 presentOpenInMenuFromRect 总是返回 NO

我发现使用 presentOptionsMenuFromRect 的公认答案确实启动了 window,但这并不是我想要的。 (这可能是你们中的一些人想要的)。

事实证明,我的设备在默认情况下根本没有与这两种类型关联的应用程序! (这有多荒谬?)我以为它们很常见,永远不会成为问题。

因此,我 运行domly 安装了我在应用商店中找到的第一个免费文件管理器应用(我选择了 USB Disk Free)。然后,我的设备让我可以选择使用该应用程序打开这些类型中的任何一种。