Попытка проверить, загружен ли контроллер представления, и затем представить это в контейнере (UISegmentedController) - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь перемещаться между контроллерами представления, используя сегментированный контроллер.Дочерний VC привязывается к родителю, и я могу переключать VC таким образом.Тем не менее, каждый раз, когда я возвращаюсь к сегменту, VC восстанавливается снова и снова.Как я могу заставить VC присоединиться снова, если он уже загружен в память?

Вот мой код и как я пытаюсь проверить, загружено ли представление.

@objc func changeView1(_ kMIDIMessageSendErr: Any?) {
    let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "View1")

    if childViewController.isViewLoaded == true {
        childViewController.didMove(toParentViewController: self)
        NSLog("ViewIsLoaded1")
    } else if childViewController.isViewLoaded == false {
        self.addChildViewController(childViewController)
        self.view.addSubview(childViewController.view)
        childViewController.didMove(toParentViewController: self)
        NSLog("ViewIsLoaded2")
    }
}

@objc func changeView2(_ kMIDIMessageSendErr: Any?) {
    let childViewController2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "View2")

    if childViewController2.isViewLoaded == true {
        childViewController2.didMove(toParentViewController: self)
        NSLog("ViewIsLoaded3")
    } else if childViewController2.isViewLoaded == false {
        self.addChildViewController(childViewController2)
        self.view.addSubview(childViewController2.view)
        childViewController2.didMove(toParentViewController: self)
        NSLog("ViewIsLoaded4")
    }
}

IЯ могу изменить ВК, используя сегментированный элемент управления, но я не хочу перезагружать ВК каждый раз, когда меняю сегменты.

1 Ответ

0 голосов
/ 28 сентября 2018

Существует ряд проблем с вашим кодом:

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)
    }
}
...