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 глобальным. Объявите объект глобально для этого класса, а затем присвойте значение внутри блока.

Другие вопросы по тегам