Где использовать 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)
: при нажатии "Отмена" средство выбора документов уже само по себе закрывается.