代码之家  ›  专栏  ›  技术社区  ›  Adem

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

  •  0
  • Adem  · 技术社区  · 6 年前

    下面是我的代码,以及我如何检查是否加载了视图。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Pete Morris    6 年前

    1) 每次运行这些函数中的任何一个时,都会创建子控制器的全新实例。因此 isViewLoaded 总是错误的,执行流到你的 else 每次都封锁。

    else if 不需要。

    3) 如果上述问题解决了,你就不应该打电话 didMove(toParentViewController:) 换回来。您应该只是隐藏和取消隐藏视图。

    解决办法如下:

    1) 将引用作为实例变量指定给子控制器,并且仅当该引用为nil时才创建子控制器。

    已加载isViewLoaded ,检查实例变量引用是否为nil。

    if 其他的 条款-这是多余的。

    4) 在你的 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)
        }
    }