尝试以编程方式呈现包含的View Controller

时间:2014-10-26 00:20:59

标签: swift uiviewcontroller xcode6

使用XCode 6.1我试图用自定义菜单滚动我自己的View Controller包含...我在主视图控制器中使用以下功能来呈现子视图控制器:

var currentController: UIViewController?

// Function within main view controller class
func presentController(controller: UIViewController) {
    if currentController != controller {
        if currentController != nil {
            currentController!.willMoveToParentViewController(nil)
            currentController!.view.removeFromSuperview()
            currentController!.removeFromParentViewController()
        }
        controller.willMoveToParentViewController(self)
        self.addChildViewController(controller)
        self.view.addSubview(controller.view)
        controller.didMoveToParentViewController(self)
        currentController = controller
    }
}

最初投放该应用时,我在self.presentController(firstViewController)内使用了viewDidAppear,这有效。

但是,在我的自定义菜单中(使用REMenu)在主视图控制器之外,我正在尝试显示所选的视图控制器,如下所示:MainViewController().presentController(secondViewController)。当这个运行时,currentController被删除(显示主视图控制器的视图,这只是一个黑色背景)但新控制器没有被加载。

有人能引导我朝正确的方向前进吗?

1 个答案:

答案 0 :(得分:6)

假设MainViewController是主视图控制器类的名称,则以下行可能不会执行您的操作:

MainViewController().presentController(secondViewController)

MainViewController()将实例化主视图控制器的新副本。我假设您打算获得对现有控制器的引用,而不是实例化新控制器。


与您手头的问题无关,但在致电willMoveToParentViewController之前不应致电addChildViewController(因为它会为您做到这一点)。您只需在完成配置新控制器视图后拨打didMoveToParentViewController即可。因此:

func presentController(controller: UIViewController) {
    if currentController != controller {
        if currentController != nil {
            currentController!.willMoveToParentViewController(nil)
            currentController!.view.removeFromSuperview()
            currentController!.removeFromParentViewController()
        }
        // controller.willMoveToParentViewController(self)
        self.addChildViewController(controller)
        self.view.addSubview(controller.view)
        controller.didMoveToParentViewController(self)
        currentController = controller
    }
}