哪里可以使用popToRootViewController在堆栈中弹出额外的VC?

时间:2018-02-21 01:00:37

标签: ios swift stack uidocumentpickervc

我有一个带两个按钮的视图控制器: Button1调出documentPickerViewController并让用户选择一个文件。 Button2转到第二个视图控制器。

Button1链接到" openFile"在下面的代码中。 Button2将segue调用到第二个视图控制器。

所以这就是我遇到问题的方法: 单击Button1,显示文档选择器。 如果我选择一个文档,那么文档选择器就会消失,我回来查看控制器。 到目前为止一切都很好。

现在我按下Button2。第二个视图控制器出现。都好。我退出并返回第一个视图控制器。

现在我再次按下Button1。文件选择器出现。 但这次我点击"取消"。文档选择器消失,但SECOND视图控制器出现!

我明白了 "对< _UIWaitingForRemoteViewContainerViewController:0x122206480>开始/结束外观转换的非平衡调用。"和 " [DocumentManager]视图服务以错误终止:错误Domain = _UIViewServiceErrorDomain Code = 1"(null)" UserInfo = {Terminated = disconnect method}"

从研究中我了解到我必须在堆栈中弹出一个额外的第二个视图控制器,但是我无法看到我在哪里完成它以及哪个地方适合弹出它?

我尝试过设置"动画:false"而且没有任何区别。

提前致谢。

@IBAction func openFile(_ sender: Any) {

    let documentPicker: UIDocumentPickerViewController = UIDocumentPickerViewController(documentTypes: ["public.text"], in: UIDocumentPickerMode.import)
    documentPicker.delegate = self
    documentPicker.modalPresentationStyle = UIModalPresentationStyle.fullScreen
    self.present(documentPicker, animated: true, completion: nil)

}


func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {

    self.dismiss(animated: true, completion: nil)

}

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    if controller.documentPickerMode == UIDocumentPickerMode.import {
        var textRead = ""
        do {
            if urls.count > 0 {
                for i in 0...urls.count-1 {
                    textRead = try String(contentsOf: urls[i], encoding: .utf8)
                    textView.text = textView.text + textRead
                }
            }
        }
        catch {
            /* error handling here */
            print("There's a problem reading the file")
        }

    }

}

2 个答案:

答案 0 :(得分:0)

经过更多的实验和研究,我发现这阻止了第二个视图控制器出现,即使两个错误消息仍然出现:

func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {

    //self.dismiss(animated: true, completion: nil)
    self.navigationController?.popToRootViewController(animated: true)
}

如果有人可以提出一个更优雅的解决方案来完全消除错误信息,那么仍然会感激不尽。

编辑:

在玩了一下之后,我找到了修复!

我们只需要这个:

func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {

    // do nothing. The picker is dismissed anyway.
}

因此,解雇声明导致了这个问题。通过省略任何解雇拣货员电话,拣货员窗口无论如何都会关闭。

答案 1 :(得分:0)

我不确定您在documentPickerWasCancelled(_:)的实施中想要做什么,但要知道如果您只想隐藏文档选择器,则无需明确调用self.dismiss(animated: true, completion: nil):点击“取消”,文档选择器已经自动解散。