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

时间:2018-09-27 16:42:48

标签: ios swift uiviewcontroller uisegmentedcontrol

我正在尝试使用分段控制器导航视图控制器。子级VC与父级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")
    }
}

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

1 个答案:

答案 0 :(得分:0)

您的代码有很多问题:

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

2)不需要else if

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

解决方案如下:

1)将对您的子控制器的引用分配为实例变量,并仅在该引用为nil时创建一个子代。

2)检查实例变量引用以查看其是否为nil,而不是检查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)
    }
}