我正在尝试在特定View Controllers
上的两个孩子Container View
之间切换。我有Navigation Controller
的菜单(Table View
)来制作菜单的不同选项。
每次点击菜单选项时,我都想更改Container View
的孩子,但我会让孩子超过Navigation bar
和Table 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 Controller
与master
View Controller连接起来但我是无法将新孩子嵌入Container View
。我正在尝试的代码是:
currentController.performSegueWithIdentifier("EmbedSegue", sender: newChild)
或
currentController.presentViewController(newChild, animated: true, completion: nil)
但他们都没有嵌入segue。只需在全屏显示newChild
。
提前致谢!
答案 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