#ios #iphone #swift #uiviewcontroller #swift3
#iOS #iPhone #swift #uiviewcontroller #swift3
Вопрос:
Когда я выполняю строку ниже, мой целевой контроллер представления визуально не отображается, но в журнале ошибок нет:
performSegue (withIdentifier: "DetailsViewController", sender: self)
Давайте отступим от проблемы. Представьте, что моя успешная настройка: ViewController
загружена, и после некоторого действия пользователя приведенная выше строка фактически откроет новую DetailsViewController
. Я протестировал — все работает так, как ожидалось, — поэтому я знаю, что это работает.
Но проблема DetailsViewController
возникает, когда я решаю реализовать какой-либо сторонний фреймворк, добавив a CamViewController
в my ViewController
и выполнить segue при нажатии элемента внутри CamViewController
, затем делегировать метод, передающий это действие обратно ViewController
, из которого я бы открыл DetailsViewController
. При такой настройке архитектуры я не получаю ошибок в журнале, но визуально ничего не открывается. DetailsViewController
Никогда не представлялось.
Немного подробнее об архитектуре:
ViewController
отображаетсяCamViewController
строкаself.present(camViewController, animated: true, completion: nil)
CamViewController
реализует протокол для вызова некоторого метода при действии пользователяViewController
соответствуетCamViewController
протоколу, и метод делегирования успешно выполняется при действии пользователя (журнал показывает, что он работает)- Вызов
DetailsViewController
с идентификатором перехода выполняется успешноperformSegue (withIdentifier: "DetailsViewController", sender: self)
, ноDetailsViewController
никогда не отображается на экране. -
Этот метод ниже печатает
prepare for segue Optional("DetailsViewController")
, который звучит правильно.override func prepare(for segue: UIStoryboardSegue, sender: Any?) { print("prepare for segue (segue.identifier)") }
Я также пытался добавить super.performSegue
— не повезло
Комментарии:
1. Можете ли вы предоставить мне подробную информацию о camviewcontroller, который вы добавляете в контроллер представления
2. Конечно, это
open class CamViewController: UIViewController, XYManagerDelegate
3. в вашем журнале ничего не сказано? может быть, что-то об иерархии представлений
4. Как вы отклоняете CamViewController? Возможно ли, что у вас есть два экземпляра DetailsViewController после того, как был показан CamViewController?
Ответ №1:
Сначала я бы изменил ваш код перехода на что-то более похожее.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "DetailsViewController"){
print("prepare for segue DetailsViewController")
} else {
print("prepare for segue other")
}
}
Комментарии:
1. Спасибо. Он печатается
prepare for segue DetailsViewController
, как и ожидалось, поэтому я знаю, что переход действителен и, похоже, запускается правильно. Но контроллер представления не отображается.