UIDocumentInteractionController始终失败

时间:2015-05-08 21:49:12

标签: ios swift uidocumentinteraction

我试图使用UIDocumentInteractionController。我检查了所有我能想到的东西,一切似乎都有所需的所有数据。

调用presentOpenInMenuFromRect(inView:, animated:)时,返回的Bool始终为false。我的理解是,因为没有任何支持UTI的应用程序。我尝试使用平坦的PNG,但仍然没有。有趣的是,为什么它不能在我的iPhone上工作,因为有很多应用程序支持通过UIDocumentInteractionController加载图像,但这里是踢球者。在将项目升级到Swift 1.2之前,此代码工作正常。

我现在忽略了什么吗?我检查了文档,找不到我遗漏的任何内容。

注意:我在设备上和模拟器中对此进行了测试,两者都返回相同的值。

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")
                        }
                    }
                }
            }
        }

3 个答案:

答案 0 :(得分:3)

我决定选择presentOptionsMenuFromRect(:, inView:, animated:)来做我想要完成的事情。不知道为什么presentOpenInMenuFromRect(: inView:, animated:)决定分解,但我确实做了所有工作。

答案 1 :(得分:0)

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

更改您的代码:

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")
                    }
                }
            }
        }
    }
})

答案 2 :(得分:0)

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

我发现使用presentOptionsMenuFromRect的已接受答案确实启动了该窗口,但这并不是我想要的。 (这可能是你们中的一些人想要的)。

事实证明,我的设备默认没有与这两种类型相关联的应用! (这有多荒谬?)我认为它们非常普遍,永远不会成为问题。

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