Переключение обратно в приложение после сохранения на iCloud Drive из UIDocumentInteractionController удаляет иерархию навигации

Я использую 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?

2 ответа

Решение

Таким образом, получается, что для поддержания стека навигации необходимо передать контроллер навигации в 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 / любой из параметров в листе действий, мой стек навигации не удаляется.

Я надеюсь, что это поможет кому-то и в будущем.

Не могли бы вы попробовать изменить код и попробуйте:

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)
    } 
Другие вопросы по тегам