尝试以编程方式呈现包含的视图控制器

3

我正在使用XCode 6.1尝试使用自定义菜单来实现视图控制器的容器化... 我在我的主视图控制器中使用以下函数来呈现子视图控制器:

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
    }
}

应用初始运行时,我在 viewDidAppear 中使用 self.presentController(firstViewController) ,这个方法可行。

不过,在我的自定义菜单(使用 REMenu)中,我尝试像这样显示所选视图控制器: MainViewController().presentController(secondViewController)。当这个方法运行时,当前控制器会被移除(显示主视图控制器的视图,只是一个黑色背景),但新的控制器并没有被加载进来。

有没有人能指导我正确的方向?

1个回答

6
假设MainViewController是您主视图控制器类的名称,那么以下这行代码可能不能达到您的预期效果:
MainViewController().presentController(secondViewController)
MainViewController() 将实例化一个新的主视图控制器。我认为您的意思是要获取对现有控制器的引用,而不是创建一个新的控制器。
与您手头的问题无关,但在调用 addChildViewController 之前不应该调用 willMoveToParentViewController(因为它已经替你完成了这个步骤)。只有当您完成配置新控制器的视图后,才需要调用 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
    }
}

1
非常感谢您的帮助。我最终在应用程序入口处执行了 let applicationController = MainApplicationController(),然后我就能够使用 applicationController.presentController(viewController) 来更改当前控制器了。太棒了。谢谢! - Jody Heavener

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接