Где использовать popToRootViewController для извлечения дополнительного VC из стека?

У меня есть контроллер представления с двумя кнопками: Button1 вызывает documentPickerViewController и позволяет пользователю выбрать файл. Button2 переходит ко второму контроллеру просмотра.

Button1 связан с "openFile" в коде ниже. Button2 вызывает переход ко второму контроллеру представления.

Вот как я могу решить эту проблему: нажмите кнопку 1, появится окно выбора документов. Если я выберу документ, то средство выбора документов исчезнет, ​​и я вернусь к контроллеру. Все идет нормально.

Теперь я нажимаю Button2. Контроллер второго вида обнаруживается. Все хорошо. Я выхожу и возвращаюсь к 1-му виду контроллера.

Теперь я снова нажимаю Button1. Сборщик документов обнаруживается. Но на этот раз я нажимаю "отменить". Средство выбора документов исчезает, но появляется контроллер ВТОРОГО представления!

Я получаю "Несбалансированные вызовы для начала / окончания переходов внешнего вида для <_UIWaitingForRemoteViewContainerViewController: 0x122206480>". и "[DocumentManager] Служба просмотра завершилась с ошибкой: Ошибка Domain=_UIViewServiceErrorDomain Code=1 "(null)" UserInfo={Termination =disconnect method}"

Из исследования я понимаю, что я, должно быть, вставил дополнительный контроллер второго представления в стек, но я не вижу, где бы я это сделал, а также где было бы подходящее место для его установки?

Я попытался установить "animated: 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 ответа

Решение

После дополнительных экспериментов и исследований, я обнаружил, что это остановило появление второго контроллера представления, хотя два сообщения об ошибках все еще появляются:

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.
}

Таким образом, заявление об увольнении стало причиной проблемы. Если пропустить любой вызов средства "Отмена", окно выбора все равно закрывается.

Я не уверен, что вы хотите сделать в своей реализации documentPickerWasCancelled(_:) но знайте, что если вы просто хотите скрыть средство выбора документов, вам не нужно явно вызывать self.dismiss(animated: true, completion: nil): при нажатии "Отмена" средство выбора документов уже само по себе закрывается.

Другие вопросы по тегам