在swift 4中处理多个视图控制器

时间:2018-03-15 10:37:38

标签: swift4

新手在这里...我的根视图控制器具有以下代码:

func showVC1() {
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    let vc1 = storyBoard.instantiateViewController(withIdentifier: "first")
    self.present(vc1, animated:true, completion:nil)
}

func showVC2() {
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    let vc2 = storyBoard.instantiateViewController(withIdentifier: "second")
    self.present(vc2, animated:true, completion:nil)
}

我可以按任意顺序调用这些函数,第一个工作正常,但第二个会给我一个错误,例如"尝试在视图中显示不在窗口层次结构中!"

我想我想将所有代码保存在包含这些函数的root vc中。我怎样才能做到这一点?

我还担心每次调用这些函数时,我都会创建新的vc实例,这将使用更多的内存。有没有办法在这些函数之外引用这些vc?这会解决层次结构问题吗?

2 个答案:

答案 0 :(得分:-1)

而不是呈现新的视图控制器,尝试将其推入导航堆栈,如

self.navigationController.pushViewController(controller, animated: false)

因为如果您在控制器上出现任何内容,它将无法继续导航。这将导致崩溃

答案 1 :(得分:-2)

是的,第二个给出错误,因为您试图从根视图控制器同时呈现两个视图控制器。

您可以创建对这些视图控制器的延迟引用

lazy var firstViewController : FirstViewController = {
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let vc1 = storyBoard.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
        return vc1
    }()

 @IBAction func buttonPressed(_ sender: Any) {
        self.present(firstViewController, animated:true, completion:nil)
    }