尝试检查是否加载了视图控制器,然后将其呈现在容器中 (UISegmentedController)

Trying to check if a view controller is loaded, and then presenting that within a container (UISegmentedController)

我正在尝试使用分段控制器导航视图控制器。 child VC 附加到 parent,我可以这样切换 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")
    }
}

我可以使用分段控件更改 VC,但我不想每次更改分段时都重新加载 VC。

你的代码有很多问题:

1) 每当这些函数中的任何一个为 运行 时,您都在创建子控制器的全新实例。因此 isViewLoaded 始终为假,并且每次执行都会流入您的 else 块。

2) 不需要else if

3) 如果上面的问题都解决了,你不应该调用 didMove(toParentViewController:) 切换回来。您应该只是隐藏和取消隐藏视图。

解决方法如下:

1) 将对子控制器的引用作为实例变量分配,并且仅当该引用为 nil 时才创建子控制器。

2) 不要检查 isViewLoaded,而是检查您的实例变量引用以查看它是否为 nil。

3) 删除 else 子句的 if 部分 - 这是多余的。

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