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)。然后,我的设备让我可以选择使用该应用程序打开这些类型中的任何一种。
我正在尝试使用 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)。然后,我的设备让我可以选择使用该应用程序打开这些类型中的任何一种。