无法将类型 'ViewController.Type' 的值转换为预期的参数类型 'UIViewController'
Cannot convert value of type 'ViewController.Type' to expected argument type 'UIViewController'
我已经分析了 问题,但它是关于 alertController
实际上我正在做的是,我正在使用 ContainerViews
到 MasterVC
。我正在关注这个 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" 部分对此进行了解释。他在那里展示了主视图控制器如何创建要包含的视图控制器的实例。
我已经分析了 alertController
实际上我正在做的是,我正在使用 ContainerViews
到 MasterVC
。我正在关注这个 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" 部分对此进行了解释。他在那里展示了主视图控制器如何创建要包含的视图控制器的实例。