Ios 如何正确创建包含一些ViewController的容器视图(以编程方式)?

Ios 如何正确创建包含一些ViewController的容器视图(以编程方式)?,ios,swift,Ios,Swift,我想以编程方式创建一个容器视图,其中包含一组视图控制器。我有一个分段控制器,当用户点击一个按钮时,它应该显示一个特定的viewController,而不进行分段。 我把所有东西都放在一个ViewController里, 我想知道如何正确地使分段控制器在点击时显示某个视图控制器 func setUpSegmentedControl() { let seg = UISegmentedControl(items: ["1", "2", "3"]) seg.selectedSegment

我想以编程方式创建一个容器视图,其中包含一组视图控制器。我有一个分段控制器,当用户点击一个按钮时,它应该显示一个特定的viewController,而不进行分段。 我把所有东西都放在一个ViewController里, 我想知道如何正确地使分段控制器在点击时显示某个视图控制器

func setUpSegmentedControl() {
    let seg = UISegmentedControl(items: ["1", "2", "3"])
    seg.selectedSegmentIndex = 0
    seg.translatesAutoresizingMaskIntoConstraints = false

    seg.layer.cornerRadius = 8  
    seg.backgroundColor = UIColor.white 
    seg.addTarget(self, action: #selector(changeColor(sender:)), for: .valueChanged)
   view.addSubview(seg)

           NSLayoutConstraint.activate([
 seg.centerXAnchor.constraint(equalTo: view.centerXAnchor),                                                     seg.centerYAnchor.constraint(equalTo: view.centerYAnchor),                                     seg.leadingAnchor.constraint(equalTo: view.leadingAnchor),                                   seg.trailingAnchor.constraint(equalTo: view.trailingAnchor),                                seg.heightAnchor.constraint(equalToConstant: 50)

        ])
}   

 @objc func changeColor(sender: UISegmentedControl) {
    switch sender.selectedSegmentIndex {
    case 0:
        addChild(FirstViewController())

        print("1")
    case 1:
        addChild(SecondViewController())

    print("2")
    default:
        addChild(ThirdViewController())

        print("3")
    }
}

要以编程方式将视图控制器添加到容器视图,除了调用
addChild
之外,还需要调用
addSubview
didMove

let firstViewController = FirstViewController()
addChild(firstViewController)
firstViewController.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(firstViewController.view) // replace `containerView` with the name of the view that's supposed to contain the VC's view

// add constraints or set frame manually
let trailingConstraint = firstViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
let leadingConstraint = firstViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let topConstraint = firstViewController.view.topAnchor.constraint(equalTo: view.topAnchor)
let bottomConstraint = firstViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
NSLayoutConstraint.activate([trailingConstraint, leadingConstraint, topConstraint, bottomConstraint])

firstViewController.didMove(to parent: self)
如果要以编程方式删除子视图控制器,请执行以下操作:

let child = children.first // or other way to identify your VC
child?.willMove(toParentViewController: nil)
child?.view.removeFromSuperview()
child?.view.removeFromParentViewController()

它可以工作,但当它从第一个按钮开始时,默认情况下会点击第一个按钮,它不会显示firstViewController,直到我点击第二个按钮,然后返回到第一个按钮,它才会显示firstViewController@Jose这是因为在你点击一个按钮之前,你不会调用
changeColor
。尝试在
setUpSegmentedControl
之后调用
changeColor
。请记住在再次添加子VC之前删除它。现在默认情况下,它首先显示firstViewController,但当它显示第一次时,会在firstViewController和分段控制器上放置空间,您能帮助我吗?@Jose我更新了我的答案,并提供了一个指向示例项目的链接,该项目完成了您尝试执行的操作。