ContainerView具有多个嵌入segues
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ContainerView具有多个嵌入segues相关的知识,希望对你有一定的参考价值。
有没有办法让一个ContainerView具有多个嵌入段?目的是让ContainerView根据按下的按钮保持几个不同的ViewControllers;一次只能看到一个。我想使用嵌入segues,这样在Interface Builder中,故事板会自动显示与ContainerView相同的大小。
我意识到我可以手动调整InterfaceBuilder中的其他ViewControllers,但我想要嵌入segue提供的自动调整大小。如果可以采用另一种方式,那也没关系。没有在viewDidLoad上加载视图很好 - 如前所述,显示的ViewController可以根据按下的按钮进行更改。
不,没有办法将多个嵌入segue放到一个容器视图中。在IB中进行所有设置的一种方法是使嵌入式控制器成为UITabBarController(隐藏标签栏)。然后,您可以根据需要在选项卡中包含任意数量的控制器,并使用UITabBarController的selectedIndex属性在代码中切换到它们。
我发现这篇精彩的文章解释了如何做到这一点:http://sandmoose.com/post/35714028270/storyboards-with-custom-container-view-controllers
你得到你的容器并且可以调用后面的任何视图控制器,有一些设置可以将所有内容链接起来但是一旦完成,你就会得到一个仍然可用的故事板。
我认识到这个问题有点老了,但我想回答一下你还在寻找或其他人发现这个问题。我有一个类似的问题,我解决了它。
简而言之,您将拥有三个层次: - 外部视图控制器(“ExternalViewController”) - 视图控制器管理器(“ViewControllerManager”) - 您实际想要切换的子视图控制器(“ChildViewController”)
在ExternalViewController中使用容器视图,并在ViewControllerManager中嵌入segue。然后,ViewControllerManager本身将以编程方式保存其他ChildViewControllers,如in this Apple documentation所述,特别是有关添加和删除子项的部分。
添加子视图控制器时,将其框架设置为与ViewControllerManager的框架相同(因为您在ViewControllerManager中执行此操作,将子框架设置为等于self.view.frame)。当然,您还需要一些逻辑和一个外部控件来进行ExternalViewController内部的切换。
希望这可以帮助!
是的,我能够通过@rdelmar帖子实现您所寻求的灵感。您需要做的是将UITabBarViewController
嵌入到容器视图中。然后以编程方式选择要呈现的控制器。您可能还想隐藏标签栏。
如果需要,还可以隐藏故事板文件中显示的标签栏
您可以通过继承UITabBarController来选择要显示的视图控制器:
override func viewDidLoad() {
super.viewDidLoad()
self.selectedIndex = 1
}
您可以通过调用self.tabBarController?.tabBar.hidden = true
in viewDidLoad()隐藏视图控制器中的选项卡栏。
我通过使用-shouldPerformSegueWithIdentifier:sender:
实现了这一目标。我有一个传递一个对象的容器,根据该对象的类型决定要显示哪个子视图控制器。
该结构似乎有点过于复杂,但允许基本视图控制器忽略我拥有的不同类型的任务,将其留给容器视图控制器。然后容器视图控制器具有多个容器视图,这些视图仅根据任务的类型执行。
我不知道你是否可以通过调用-performSegueWithIdentifier:sender:
手动执行嵌入segue,但这也可能是一种可能性。
我也挣扎了很长时间。我有这样的情况,我有不同但类似的嵌入式表视图控制器,我想根据在视图控制器的segue中设置的参数显示。有效的方法是在视图控制器中放入带有IBOutlet的嵌入式容器。容器可以具有在IB中设置的大小约束。但是,不要在IB中进行任何嵌入。然后在viewDidLoad中,我以编程方式添加正确的视图控制器并将其边缘固定到嵌入容器。
这种方法的核心见于以下代码(Swift 4):
extension UIView {
func pinToParent() {
self.translatesAutoresizingMaskIntoConstraints = false
let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left]
NSLayoutConstraint.activate(attributes.map {
NSLayoutConstraint(item: self, attribute: $0, relatedBy: .equal, toItem: self.superview, attribute: $0, multiplier: 1, constant: 0)
})
}
}
class ColorVC: UIViewController {
@IBOutlet weak var tableContainer: UIView!
var color : rgb = .red
fileprivate var colorTableVC : ColorTableVC?
override func viewDidLoad() {
super.viewDidLoad()
switch color {
case .red:
colorTableVC = RedTableVC.init(style: .plain)
case .green:
colorTableVC = GreenTableVC.init(style: .plain)
case .blue:
colorTableVC = BlueTableVC.init(style: .plain)
}
if let vc = colorTableVC {
if (vc.view) != nil {
self.addChildViewController(vc)
tableContainer.addSubview(vc.view)
vc.view.pinToParent()
vc.didMove(toParentViewController: self)
}
}
}
}
在ColorVC中,可以看到容器IBOutlet和主表视图控制器设置的“颜色”参数。 RedTableVC,GreenTableVC和BlueTableVC都是ColorTableVC的子类,它是UITableViewController的子类。共同遗产让我使用一个“colorTableVC”变量来指向任何实例化的控制器。 (不完全必要)。但这确实避免了重复下面的代码来在heirarchy中添加视图并将新控制器固定到容器视图。在顶部,我在UIView上做了一个扩展,将视图固定到其父级边缘。
下图显示了如何在IB中设置项目,尤其是右侧的视图控制器。在这个例子中,我将“嵌入式”控制器的高度设置为主视图控制器高度的一半 - 因此当您旋转设备时,可以看到确实应用了IB中设置的约束。
以上是关于ContainerView具有多个嵌入segues的主要内容,如果未能解决你的问题,请参考以下文章
嵌入在 containerView 中的 PageViewController 显示前一个视图的小边距
ContainerView 内的嵌入式 UICollectionView - 关于旋转问题
ContainerView中嵌入的iOS7 SplitviewController不旋转