UIDocumentInteractionController не работает
В моем приложении я хочу загрузить различные типы файлов и экспортов, чтобы пользователь мог открыть файл с помощью приложения, которое открывает этот тип файла. Я пытаюсь использовать UIDocumentInteractionController, но после загрузки сохраните его на моем устройстве и попытайтесь открыть его, возникли некоторые проблемы. С.docx приложение разрывается, а с другими файлами оно не отображается для кодирования файла. Что я могу делать не так?
Когда я пытаюсь поделиться файлом через airdrop, я получаю ошибку, которая говорит, что файл недействителен.
Когда я делюсь с iBooks, я получаю сообщение "NSInternalInconsistencyException", причина: "UIDocumentInteractionController ушел преждевременно! "И приложение ломается
Это мой код:
func loadArchiveAtIndex(sender: NSNotification){
let itemIndex = sender.userInfo!["index"] as! Int
let archiveKey = sender.userInfo!["downloadKey"] as! String
self.downloadingItens.append(itemIndex)
SQLiteDataController().getTokenSincronismo({
(Valido, Retorno, Token, Tipo) -> Void in
if Valido == true{
switch Retorno {
case 9: // Retorno Válido
let params = [
"tokenSincronizacao":"\(Token)",
"chaveProdutoBiblioteca":"\(archiveKey)"
]
Alamofire.request(.GET, "\(_URLPREFIX)/WSMhobErpServico/api/sincronizar/ProdutoBiblioteca/ObtemProdutoBiblioteca", parameters: params).responseJSON { (response) in
if response.result.isFailure {
print(response.result.error)
} else {
let result = response.result.value
if let archive = result?["ProdutoBiblioteca"] as? NSDictionary{
let bytes = archive.objectForKey("Arquivo") as! String
let name = archive.objectForKey("NomeArquivo") as! String
let data = NSData.init(base64EncodedString: bytes, options: .IgnoreUnknownCharacters)
let url = NSURL.init(string: name.lowercaseString)
data?.writeToURL(url!, atomically: true)
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let fileURL = documents.URLByAppendingPathComponent((name.lowercaseString))
let dic = UIDocumentInteractionController.init(URL: fileURL!)
dic.delegate = self
dic.presentOpenInMenuFromRect(CGRect.init(x: 0, y: 0, width: 200, height: 200), inView: self.view, animated: true)
var arrayIndex = 0
for item in self.downloadingItens {
let i = item
if i == itemIndex {
self.downloadingItens.removeAtIndex(arrayIndex)
NSNotificationCenter.defaultCenter().postNotificationName("reloadTable", object: nil, userInfo: ["itens":self.downloadingItens])
break
}
arrayIndex = arrayIndex + 1
}
} else {
print("erro")
}
}
}
break
default:
self.showError("Atenção", message: "Não foi Possivel Processar a sua Solicitação")
break
}
}else{
self.showError("Atenção", message: "Não foi Possivel Processar a sua Solicitação")
}
}, sincFull:true)
}
func documentInteractionControllerViewForPreview(controller: UIDocumentInteractionController) -> UIView? {
return self.view
}
func documentInteractionControllerRectForPreview(controller: UIDocumentInteractionController) -> CGRect {
return self.view.frame
}
func documentInteractionControllerViewControllerForPreview(controller: UIDocumentInteractionController) -> UIViewController {
return self
}
2 ответа
let name = archive.objectForKey("NomeArquivo") as! String
let data = NSData.init(base64EncodedString: bytes, options: .IgnoreUnknownCharacters)
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let fileURL = documents.URLByAppendingPathComponent((name.lowercaseString))
data?.writeToURL(fileURL!, atomically: true)
Хорошо, я понял вашу точку зрения.
Я проверил ваш код и думаю, что проблема в строке ниже
let dic = UIDocumentInteractionController.init(URL: fileURL!)
dic.delegate = self
Вы создаете объект UIDocumentInteractionController внутри блока, поэтому, когда блоку не хватит памяти или он будет освобожден, ваш объект UIDocumentInteractionController также будет освобожден.
Поэтому сделайте объект UIDocumentInteractionController глобальным. Объявите объект глобально для этого класса, а затем присвойте значение внутри блока.