我正在使用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切换回来之后,我该怎样做才能保持在我调用此方法的同一个视图控制器上?
答案 0 :(得分: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)
}
答案 1 :(得分:1)
事实证明,为了维护导航堆栈,您需要将导航控制器传递到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 /操作表中的任何选项后切换回我的应用程序时,我的导航堆栈不会被删除。
我希望这对未来的人有所帮助。