Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 尝试以编程方式显示包含的视图控制器_Swift_Uiviewcontroller_Xcode6 - Fatal编程技术网

Swift 尝试以编程方式显示包含的视图控制器

Swift 尝试以编程方式显示包含的视图控制器,swift,uiviewcontroller,xcode6,Swift,Uiviewcontroller,Xcode6,使用XCode 6.1,我尝试使用自定义菜单滚动我自己的视图控制器包含。。。我在主视图控制器中使用以下函数来显示子视图控制器: var currentController: UIViewController? // Function within main view controller class func presentController(controller: UIViewController) { if currentController != controller {

使用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
    }
}
当应用程序最初运行时,我使用
self.presentController(firstViewController)
内部
viewdide
,这很有效

但是,在主视图控制器之外的自定义菜单(使用)中,我尝试按如下方式显示所选视图控制器:
MainViewController().presentController(secondViewController)
。运行此操作时,currentController将被删除(显示主视图控制器的视图,该视图仅为黑色背景),但新控制器不会加载


有人能给我指引正确的方向吗?

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

非常感谢你这么做。最后我在应用程序入口点执行了
let applicationController=main applicationController()
,然后我可以执行
applicationController.presentController(viewController)
来更改当前控制器。太神了谢谢