Swift 3: Выполняет запуск с идентификатором, не отображающим контроллер представления, без ошибок

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