Программно переходить между представлениями в разных файлах раскадровки - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть представление HostViewController в Host.storyboard, и в раскадровке я могу перейти к AttendDetailViewController в Main.storyboard. Однако я хочу сделать это программно следующим образом:

private func attendDetailViewControllerSegue(event: CAEvent) {
    let vc = AttendDetailViewController(nibName: "AttendDetailViewController", bundle: nil)
    vc.event = event

    navigationController?.pushViewController(vc, animated: true)
}

Однако, когда я запускаю это, я получаю следующую ошибку:

'NSInternalInconsistencyException', причина: 'Не удалось загрузить NIB в комплекте:' NSBundle ... с именем 'AttendDetailViewController' '

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

Есть какие-нибудь мысли о том, как сделать этот переход без исключения?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы должны получить раскадровку из комплекта:

var hostStoryboard = UIStoryboard(name: "Host", bundle: Bundle.main)

Затем создайте экземпляр контроллера представления и представьте:

let someViewController = hostStoryboard?.instantiateViewController(withIdentifier: "AttendDetailViewController") as? AttendDetailViewController
self.navigationController?.present(attendDetailViewController!, animated: true)

Не забудьте установить идентификатор раскадровки AttendDetailViewController в раскадровке.


Я также рекомендую вам безопасно развернуть attendDetailViewController перед использованием:

let someViewController = hostStoryboard?.instantiateViewController(withIdentifier: "AttendDetailViewController") as? AttendDetailViewController
if let vc = attendDetailViewController {
    self.navigationController?.present(vc, animated: true)
}
0 голосов
/ 01 ноября 2018

1 - загрузить из xib (используется, когда в вашем проекте есть файл AttendDetailViewController.xib)

 let vc  = AttendDetailViewController(nibName: "AttendDetailViewController", bundle: nil)

2 - загрузить с раскадровки (используется, когда виртуальный канал находится внутри раскадровки)

 let vc = UIStoryboard(name: "Host", bundle: nil)!.instantiateViewController(withIdentifier: "vciD") as? AttendDetailViewController

3 - программная загрузка (используется, когда макет vc создается программно)

let vc = AttendDetailViewController()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...