如何在Swift上的两个子视图控制器之间切换?

时间:2016-09-05 10:07:53

标签: ios swift uinavigationcontroller uistoryboardsegue uicontainerview

我正在尝试在特定View Controllers上的两个孩子Container View之间切换。我有Navigation Controller的菜单(Table View)来制作菜单的不同选项。

每次点击菜单选项时,我都想更改Container View的孩子,但我会让孩子超过Navigation barTable View(他们没有显示但是它们属于新的子视图控制器。)

我的Main.storyboard的方案是这样的:

Navigation Controller --> View Controller (With 2 Container View, 1 for Table View
                                           and the other to set master View Controller)
                                         |
                                         |
                               ------------------------
                               |                      |
                          View Controller        Table View
                            (id: master)

                   View Controller (id: Home)   View Controller (id: screen2)

我在tableView函数上有以下代码(我在其中检测到菜单的选项何时被单击)以更改容器视图的子视图控制器:

let currentController = self.navigationController?.visibleViewController //container

var oldChild = (currentController?.childViewControllers.last!)! as UIViewController //master
let newChild = (storyboard?.instantiateViewControllerWithIdentifier("Home"))! as UIViewController //Home

if (oldChild != newChild){
    if currentController.childViewControllers.last != nil{
        oldChild.willMoveToParentViewController(nil)
        currentController.navigationController?.navigationBar.willRemoveSubview(oldChild.view)
        //oldChild.view.removeFromSuperview()
        oldChild.removeFromParentViewController()
    }

    currentController.addChildViewController(newChild)
    currentController.view.addSubview(newChild.view)
    newChild.didMoveToParentViewController(currentController) 
}

此代码运行良好。问题是新的子视图控制器显示在导航栏和表视图(菜单)上方。所以它占据了整个屏幕,而不是适合容器视图。

我应该在代码中添加更多内容,还是以错误的方式使用代码?我已经搜索了很多关于它的信息,但大多数解决方案都是客观的,或者对我不起作用。

编辑:在搜索了很多小时后,我怀疑它是与嵌入式segue相关的东西,它将根View Controllermaster View Controller连接起来但我是无法将新孩子嵌入Container View。我正在尝试的代码是:

currentController.performSegueWithIdentifier("EmbedSegue", sender: newChild)

currentController.presentViewController(newChild, animated: true, completion: nil)

但他们都没有嵌入segue。只需在全屏显示newChild

提前致谢!

6 个答案:

答案 0 :(得分:4)

您应该将ContainerO的IBOutlet和addSubview添加到此IBOutlet

currentController.containerView.addSubview(newChild.view)

currentController.addSubview(childView.view, toView: self.containerView)

答案 1 :(得分:0)

在你调用currentController .addChildViewController(newChild)之前,试试这个:

newChild.modalPresentationStyle = .CurrentContext

这应该在容器视图的边界内显示newChild视图控制器而不是全屏。

答案 2 :(得分:0)

你不想使用presentViewController,我不认为使用segue也是正确的,这些将导致全屏封面。

我认为你最初是在正确的轨道上,你需要视图还是视图控制器?

对于UIViews,您可以轻松地使用所需的值填充视图,然后使用新视图替换容器视图,还可以为xib或storyboard场景加载UIView。

对于UIViewControllers,我想如果你在查看生命周期方法时有特定的逻辑,你需要将它们添加为子视图控制器,并再次用viewController.view替换容器视图。

最后,您只需触发didselectrowatindexpath方法中的逻辑。试试一个基本的例子,用橙色backgroundcolor创建一个UIView并做self.containerView = orangeView

如果不清楚,请告诉我,如果有必要,我很乐意提供代码示例。

答案 3 :(得分:0)

//set off the viewcontroller UNDERTOPBAR property off. your VC will load in currentControllers view. you need to set the frame of the view that your are going to load.

currentController.addChildViewController(newChild)
newChild.view.frame = CGRectMake(self.currentController.bounds.origin.x, self.currentController.bounds.origin.y, self.currentController.bounds.size.width, self.currentController.bounds.size.height)
currentController.view.addSubview(newChild.view)
newChild.didMoveToParentViewController(currentController)

答案 4 :(得分:0)

制作容器的出口并添加您的子控制器:self.addSubview(self.currentViewController!.view, toView: self.containerView)

它可能对你有帮助。

答案 5 :(得分:0)

问题已得到解答,但正如我在您的代码中所看到的,我建议您将儿童视图的优势固定在父视图上。如下:

    child.view.translatesAutoresizingMaskIntoConstraints = false
    child.view.topAnchor.constraint(equalTo: parent.view.topAnchor).isActive = true
    child.view.bottomAnchor.constraint(equalTo: parent.view.bottomAnchor).isActive = true
    child.view.leadingAnchor.constraint(equalTo: parent.view.leadingAnchor).isActive = true
    child.view.trailingAnchor.constraint(equalTo: parent.view.trailingAnchor).isActive = true