ios - 如何正确制作包含一些 viewControllers 的容器 View (以编程方式)?

标签 ios swift

我想以编程方式创建一个容器 View ,其中包含一堆 View Controller 。我有一个分段 Controller ,当用户点击一个按钮时,它应该显示某个 viewController 而无需进行 segue。 我在 ViewController 中拥有一切, 我想知道如何让分段 Controller 在点击时正确显示某个 View Controller 。

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")
    }
}

最佳答案

要以编程方式将 View Controller 添加到容器 View ,除了调用 addChild 之外,还需要调用 addSubviewdidMove

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)

如果您想以编程方式删除 subview Controller :

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

Example project

关于ios - 如何正确制作包含一些 viewControllers 的容器 View (以编程方式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155798/

相关文章:

ios - 自定义通知声音不再起作用

swift - 如何在 Swift 3 中消除警告

ios - SQLite.swift(版本 0.11.2)示例代码不工作

ios - Swift 3 - 通过开关更改所有 View Controller 的背景颜色(深色模式/夜间模式)

ios - 如何读取父节点名称而不从 firebase For ios 获取值

ios - 试图检测在 scenekit 上点击了哪个节点

ios - UITableViewCell中的UILabel的高度问题

json - alamofire 编码完成 JSON 到字典

swift - 如何确保在数据加载之前我不会访问数据?

ios - 如何在 Swift 中将 [AnyObject] 数组转换为 [Hashable] 或 [AnyHashable] 数组?