ios-具有多个嵌入序列的ContainerView

有没有办法让一个具有多个嵌入序列的ContainerView? 目的是让ContainerView根据所按下的按钮来容纳几个不同的ViewController。 一次只能看到一个。 我想使用嵌入序列,以便在Interface Builder中自动以与ContainerView相同的大小显示情节提要。

我意识到我可以在InterfaceBuilder中手动调整其他ViewController的大小,但是我想要embed segue提供的自动大小调整。 如果可以使用另一种方法,那也可以。 不必在viewDidLoad上加载视图就可以了-如前所述,所显示的ViewController可以根据所按下的按钮进行更改。

Steve Haley asked 2020-08-01T07:17:22Z
7个解决方案
45 votes

不可以,无法将多个嵌入序列嵌入到一个容器视图中。 在IB中进行所有设置的一种方法是使嵌入式控制器成为UITabBarController(隐藏选项卡栏)。 然后,您可以根据需要在选项卡中具有任意数量的控制器,并使用UITabBarController的selectedIndex属性在代码中切换到它们。

rdelmar answered 2020-08-01T07:22:29Z
15 votes

我发现这篇精彩的文章准确地解释了如何执行此操作:[http://sandmoose.com/post/35714028270/storyboards-with-custom-container-view-controllers]

您得到了容器并可以调用后面的任何视图控制器,可以进行一些设置以使所有内容链接在一起,但是一旦完成,您将获得仍然可用的情节提要。

Kanjiroushi answered 2020-08-01T07:22:54Z
14 votes

我知道这个问题有点老了,但是我想回答一下,以防您仍然在寻找或其他人发现此问题。 我有一个类似的问题,并且我已经解决了。

简而言之,您将拥有三层:
-外部视图控制器(“ ExternalViewController”)
-视图控制器管理器(“ ViewControllerManager”)
-您实际上要在其间切换的子视图控制器(“ ChildViewController”)

在ExternalViewController中使用容器视图,并将其嵌入到ViewControllerManager中。 然后,如本Apple文档所述,ViewControllerManager本身将以编程方式保存其他ChildViewController,特别是有关添加和删除子级的部分。

添加子视图控制器时,将其框架设置为与ViewControllerManager的框架相同(由于您是在ViewControllerManager中进行此操作,因此将子框架设置为等于self.view.frame)。 当然,您还将需要一些逻辑和外部控件来在ExternalViewController内部进行切换。

希望这可以帮助!

UberJason answered 2020-08-01T07:23:46Z
14 votes

是的,我能够实现@rdelmar post所激发的灵感。 您需要做的是将self.tabBarController?.tabBar.hidden = true嵌入到容器视图中。 然后,以编程方式选择要显示的控制器。 您可能还想隐藏标签栏。

Container view indirectly containing more views

如果需要,还可以隐藏情节提要文件中显示的选项卡栏

您可以通过子类化UITabBarController来选择要呈现的视图控制器:

override func viewDidLoad() {
    super.viewDidLoad()
    self.selectedIndex = 1
}

您可以通过在viewDidLoad()中调用self.tabBarController?.tabBar.hidden = true来隐藏视图控制器中的标签栏。

Andrej answered 2020-08-01T07:24:20Z
2 votes

我通过使用-performSegueWithIdentifier:sender:实现了这一点。我有一个容器,该容器传递了一个对象,并根据该对象的类型决定要显示的子视图控制器。

该结构似乎有点复杂,但允许基本视图控制器忽略我拥有的不同类型的任务,而将其留给容器视图控制器。然后,容器视图控制器具有多个容器视图,仅根据任务的类型执行筛选。

我不知道您是否可以通过拨打-performSegueWithIdentifier:sender:手动手动执行嵌入segue,但这也有可能。

Fábio Oliveira answered 2020-08-01T07:24:49Z
2 votes

我为此也挣扎了很长时间。 我遇到的情况是,我想显示不同的但类似的嵌入式表视图控制器,具体取决于在视图控制器的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和主表视图控制器设置的“ color”参数。 RedTableVC,GreenTableVC和BlueTableVC都是ColorTableVC的子类,而ColorTableVC是UITableViewController的子类。 通用的属性使我可以使用一个“ colorTableVC”变量来指向任何实例化的控制器。 (并非完全必要)。 但这确实避免了重复下面的代码以将视图添加到层次结构中并将新控制器固定到容器视图。 在顶部,我对UIView进行了扩展,以将视图固定到其父边缘。

下图显示了如何在IB中设置项目,尤其是右侧的视图控制器。 在此示例中,我将“嵌入式”控制器的高度设置为主视图控制器的高度的一半-因此,当您旋转设备时,可以看到确实应用了IB中设置的约束。

Embedded controller IB setup

anorskdev answered 2020-08-01T07:28:06Z
0 votes

在您的工作viewController中,拖动uiview并将约束设置为顶部,前导,尾随,底部到安全区域(Iphone X系列)。

现在,将Container视图(内容视图)放入该UIView中。将所需的内容视图放入该UIView中,然后嵌入到各自的ViewContrllers中。

为我工作。

JobLess answered 2020-08-01T07:28:36Z
translate from https://stackoverflow.com:/questions/18407714/containerview-with-multiple-embed-segues