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