无法将类型 'ViewController.Type' 的值转换为预期的参数类型 'UIViewController'

Cannot convert value of type 'ViewController.Type' to expected argument type 'UIViewController'

我已经分析了 问题,但它是关于 alertController 实际上我正在做的是,我正在使用 ContainerViewsMasterVC。我正在关注这个 Tutorial。 当我进入 updateView() 函数并在这些行上添加或删除控制器时,我遇到了这个错误。

Cannot convert value of type 'ViewController.Type' to expected argument type 'UIViewController'

import UIKit

class MasterViewController: UIViewController {

@IBAction func segmentcontrol(_ sender: Any) {
}

@IBOutlet weak var segmentedCont: UISegmentedControl!
@IBOutlet weak var cancelMaster: UIBarButtonItem!

@IBAction func cancelMasterAct(_ sender: Any) {
}

@IBOutlet weak var createMaster: UIBarButtonItem!

@IBAction func createMasterAct(_ sender: Any) {
}


func setupView() {
    setupSegmentedControl()

    updateView()
}
private func setupSegmentedControl() {

   //  Configure Segmented Control

    segmentedCont.removeAllSegments()
    segmentedCont.insertSegment(withTitle: "Instock", at: 0, animated: false)
    segmentedCont.insertSegment(withTitle: "Checkin", at: 1, animated: false)
    segmentedCont.insertSegment(withTitle: "Inspection", at: 2, animated: false)
    segmentedCont.insertSegment(withTitle: "Checkout", at: 3, animated: false)
    segmentedCont.addTarget(self, action: #selector(selectionDidChange(_:)), for: .valueChanged)
    // Select First Segment
    segmentedCont.selectedSegmentIndex = 0


}

@objc func selectionDidChange(_ sender: UISegmentedControl) {
    updateView()
}

private func updateView() {


    if segmentedCont.selectedSegmentIndex == 0 {
        remove(asChildViewController: CheckinViewController)
        remove(asChildViewController: CheckoutViewController)
        remove(asChildViewController: InspectionViewController)
        add(asChildViewController: InstockViewController)
    }
    if segmentedCont.selectedSegmentIndex == 1 {
        remove(asChildViewController: InstockViewController)
        remove(asChildViewController: CheckinViewController)
        remove(asChildViewController: InspectionViewController)
        add(asChildViewController: CheckinViewController)
    }
    if segmentedCont.selectedSegmentIndex == 2 {
        remove(asChildViewController: InstockViewController)
        remove(asChildViewController: CheckoutViewController)
        remove(asChildViewController: CheckinViewController)
        add(asChildViewController: InspectionViewController)

    }

    else {
            remove(asChildViewController: InstockViewController)
            remove(asChildViewController: CheckinViewController)
            remove(asChildViewController: InspectionViewController)
            add(asChildViewController: CheckoutViewController)
    }

}


private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private lazy var CheckinViewController : CheckinViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "CheckinViewController") as! CheckinViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

private lazy var  InstcokViewController : InstockViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name : "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "InstockViewController") as! InstockViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()



private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

override func viewDidLoad() {

    super.viewDidLoad()
    self.setupView()
    print("MasterVC Printed")
    self.view.addSubview(segmentedCont)
    navigationController?.navigationBar.barTintColor = UIColor(red:0.00, green:0.52, blue:1.00, alpha:1.0)
    navigationController?.navigationBar.tintColor = UIColor.white

    segmentedCont.tintColor = UIColor.black

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

这是因为您的函数(例如 add(asChildViewController:) )使用 UIViewController instances 而您正试图传递 types

换句话说,你是在告诉 "Add CheckoutViewController" 而不是具体告诉应该添加哪个 CheckoutViewController。

您必须先创建视图控制器,然后再将其添加到某处。例如,如果您使用故事板:

if segmentedCont.selectedSegmentIndex == 0 {
    guard let instockVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Instock") as? InstockViewController else { return }
    add(asChildViewController: instockVC)
}

删除建议看这个回答:

您正在尝试删除视图控制器类型,而不是视图控制器的实例。考虑这一行:

remove(asChildViewController: InstockViewController)

InstockViewController 类型 的视图控制器。您需要传递该类型的 实例

编辑:在您引用的教程中,他在 "Adding a Child View Controller" 部分对此进行了解释。他在那里展示了主视图控制器如何创建要包含的视图控制器的实例。