尝试检查是否加载了视图控制器,然后将其呈现在容器中 (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)
}
}
我正在尝试使用分段控制器导航视图控制器。 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)
}
}