Существует ряд проблем с вашим кодом:
1) Каждый раз при запуске любой из этих функций вы создаете новый экземпляр вашего дочернего контроллера.Следовательно, isViewLoaded
всегда ложно, и выполнение переходит в ваш блок else
каждый раз.
2) else if
не требуется.
3) При условии, что вышерешено, вы не должны звонить didMove(toParentViewController:)
, чтобы переключиться обратно.Вы должны просто скрывать и показывать представления.
Решения этого заключаются в следующем:
1) Назначьте ссылку на ваши дочерние контроллеры как переменную экземпляра и создавайте дочерний элемент только в том случае, еслиэта ссылка равна nil.
2) Вместо проверки isViewLoaded
проверьте ссылку на переменную вашего экземпляра, чтобы увидеть, равна ли она нулю.
3) Удалите часть if
вашего else
предложение - это избыточно.
4) Внутри вашего if
блока кода просто скрывайте и отображайте соответствующие представления, используя isHidden
.
Вот пример реализации:
private var firstChild: UIViewController?
private var secondChild: UIViewController?
@objc func changeView1(_ kMIDIMessageSendErr: Any?) {
if firstChild != nil {
firstChild?.view.isHidden = false
secondChild?.view.isHidden = true
} else {
firstChild = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "View1")
self.addChildViewController(firstChild!)
self.view.addSubview(firstChild!.view)
firstChild!.didMove(toParentViewController: self)
}
}
@objc func changeView2(_ kMIDIMessageSendErr: Any?) {
if secondChild != nil {
firstChild?.view.isHidden = true
secondChild?.view.isHidden = false
} else {
secondChild = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "View2")
self.addChildViewController(secondChild!)
self.view.addSubview(secondChild!.view)
secondChild!.didMove(toParentViewController: self)
}
}