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

Posted

技术标签:

【中文标题】无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”【英文标题】:Cannot convert value of type 'ViewController.Type' to expected argument type 'UIViewController' 【发布时间】:2018-03-03 07:37:14 【问题描述】:

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

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()


【问题讨论】:

【参考方案1】:

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

换句话说,您是在告诉“添加 CheckoutViewController”,而不是具体说明应该添加哪一个 CheckoutViewController。

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

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

对于删除我建议看这个答案:How to remove the ChildViewController from Parent View Controller in Swift 3

【讨论】:

如何添加?? 请更新答案,以便解决错误> plz【参考方案2】:

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

remove(asChildViewController: InstockViewController)

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

编辑:在您引用的教程中,他在“添加子视图控制器”部分对此进行了解释。在那里,他展示了主视图控制器如何创建要包含的视图控制器的实例。

【讨论】:

我应该在那里写什么 查看我的编辑。仔细阅读教程,那里有解释。 如果你不清楚实例和类型之间的区别,你会很挣扎。

以上是关于无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”的主要内容,如果未能解决你的问题,请参考以下文章

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

“ViewController.Type 没有名为 'var 的成员

ViewController.Type 没有名为的成员

将场景中的 rootview 更改为视图控制器?

Objc <-> Swift 通用函数的 Swift 兼容性

无法将类型“类”的值分配给类型“[类]”