从 UIDocumentInteractionController 保存到 iCloud Drive 后切换回应用程序会删除导航层次结构
Switching back to the app after Saving to iCloud Drive from UIDocumentInteractionController removes navigation hierarchy
我正在使用 UIDocumentInteractionController 将指定 URL 处的文档保存到 iCloud Drive,但问题是当我在 saving/cancel 从 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 切换回来后,我应该怎么做才能保留在调用此方法的同一视图控制器上?
能否请您尝试将代码更改为此并尝试:
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)
}
原来为了维护导航栈,需要将导航控制器传入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/操作中的任何选项后切换回我的应用程序时 sheet,我的导航堆栈不会被删除。
我希望这对以后的人也有帮助。
我正在使用 UIDocumentInteractionController 将指定 URL 处的文档保存到 iCloud Drive,但问题是当我在 saving/cancel 从 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 切换回来后,我应该怎么做才能保留在调用此方法的同一视图控制器上?
能否请您尝试将代码更改为此并尝试:
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)
}
原来为了维护导航栈,需要将导航控制器传入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/操作中的任何选项后切换回我的应用程序时 sheet,我的导航堆栈不会被删除。
我希望这对以后的人也有帮助。