1

我正在使用 UIDocumentInteractionController 将指定 URL 的文档保存到 iCloud Drive,但问题是当我从 iCloud 保存/取消后切换回应用程序时,我的原始视图控制器不再存在,整个导航层次结构被删除并且显示了根视图控制器。

我正在从呈现视图控制器的视图控制器中呈现菜单中的选项。

extension ADDTextChatViewController: AddReceiverFileDelegate {
    func downloadTapped(url: String?, cell: AddReceiverTableViewCell) {
        guard let urlString = url else {return}
        shareAction(withURLString: urlString, cell: cell)
    }
}

extension ADDTextChatViewController {
    func share(url: URL, cell: AddReceiverTableViewCell) {
        documentInteractionController.url = url
        documentInteractionController.uti = url.typeIdentifier ?? "public.data, public.content"
        documentInteractionController.name = url.localizedName ?? url.lastPathComponent
        documentInteractionController.presentOptionsMenu(from: cell.btnDownload.frame, in: view, animated: true)
    }
    func shareAction(withURLString: String, cell: AddReceiverTableViewCell) {
        guard let url = URL(string: withURLString) else { return }
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else { return }
            let tmpURL = FileManager.default.temporaryDirectory
                .appendingPathComponent(response?.suggestedFilename ?? "fileName.png")
            do {
                try data.write(to: tmpURL)
            } catch { print(error) }
            DispatchQueue.main.async {
                self.share(url: tmpURL, cell: cell)
            }
            }.resume()
    }
}

extension URL {
    var typeIdentifier: String? {
        return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier
    }
    var localizedName: String? {
        return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName
    }
}

从 iCloud 切换回来后,我应该怎么做才能保持在调用此方法的同一视图控制器上?

4

2 回答 2

4

所以事实证明,为了维护导航堆栈,您需要将导航控制器传递给UIDocumentInteractionControllerDelegate方法documentInteractionControllerViewControllerForPreview

在此委托方法的文档中指出,如果呈现在导航堆栈顶部,请提供导航控制器以便以与平台其余部分一致的方式进行动画处理

所以这就是我的代码现在的样子,在实现了这个委托方法之后。

extension ADDTextChatViewController: UIDocumentInteractionControllerDelegate {
    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
        guard let navVC = self.navigationController else {
            return self
        }
        return navVC
    }
}

我补充说

documentInteractionController.presentPreview(animated: true)

代替

documentInteractionController.presentOptionsMenu(from: view.frame, in: view, animated: true)

它将首先显示这样的文档的预览(请看,这个预览将从我的推送ADDTextChatViewController

在此处输入图像描述

正如您在左下角看到的那样,箭头将提供如下选项,具体取决于文档类型

在此处输入图像描述

因此,现在当我在转换到 iCloud Drive/操作表中的任何选项后切换回我的应用程序时,我的导航堆栈不会被删除。

我希望这对将来的人也有帮助。

于 2018-04-11T13:11:23.340 回答
1

您能否尝试将您的代码更改为此并尝试:

func share(url: URL, cell : UITableViewCell) {
        documentInteractionController.url = url
        documentInteractionController.uti = url.typeIdentifier ?? "public.data, public.content"
        documentInteractionController.name = url.localizedName ?? url.lastPathComponent
        documentInteractionController.presentOptionsMenu(from: cell.btn.frame, in: view, animated: true)
    } 
于 2018-04-10T06:56:29.583 回答