无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”
Posted
技术标签:
【中文标题】无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”【英文标题】:Cannot convert value of type '(MapViewController).Type' (aka 'MapViewController.Type') to expected argument type 'UIView' 【发布时间】:2016-08-02 20:28:04 【问题描述】:我想添加子视图时遇到此错误。正如您可以在出现错误的代码中看到的那样。我是 编程方面相对较新,所以我需要帮助。我正在用 Swift 编写,没有使用故事板。
忽略我写的地方:backgroundColor = UIColor.blueColor()
编辑:我忘了提到我知道是什么导致了错误。我知道 MapViewController 是 UIViewController,我把它放在 UIView 中。但我不知道如何解决。
我想要的是将mapview
添加到单个单元格
import UIKit
import MapKit
class MapCell1: MapCell, MKMapViewDelegate
override func setupViews()
backgroundColor = UIColor.blueColor()
addSubview(MapViewController) //Cannot convert value of type '(MapViewController).Type' (aka 'MapViewController.Type') to expected argument type 'UIView'
import UIKit
import MapKit
class MapViewController: UIViewController
var window: UIWindow?
var mapView: MKMapView?
override func viewDidLoad()
super.viewDidLoad()
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.view.backgroundColor = UIColor.whiteColor()
self.mapView = MKMapView(frame: CGRectMake(0, 20, (self.window?.frame.width)!, 300))
self.view.addSubview(self.mapView!)
这是 MapCell 的代码:
import UIKit
class MapCell: BaseCell, UICollectionViewDelegate
let collectionView: UICollectionView =
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
cv.backgroundColor = UIColor.redColor()
return cv
()
let cellId = "cellId"
override func setupViews()
super.setupViews()
addSubview(collectionView)
addconstraintsWithFormat("H:|[v0]|", views: collectionView)
addconstraintsWithFormat("V:|[v0]|", views: collectionView)
And BaseCell:
mport UIKit
class BaseCell: UICollectionViewCell
override init(frame: CGRect)
super.init(frame: frame)
setupViews()
func setupViews()
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
class BaseCell: UICollectionViewCell
func setupViews()
Here is the new error
【问题讨论】:
MapViewController 是一个视图控制器...您正在尝试将其添加到视图中...我不确定您是否正在尝试这样做 是的,我正在尝试这样做。 您不能将视图控制器添加到您的视图中。您可以将视图添加到视图或将视图添加到视图控制器 【参考方案1】:这是因为您尝试将 MapViewController
的 Type
添加为子视图,而不是 MapViewController
的实际实例的视图。
它可能只会帮助你一点,但如果你这样做了
let mapViewController = MapViewController()
self.view.addSubview(mapViewController.view)
在你想做一些更有趣的事情之前,你可能没问题。
话虽如此,您可能想了解 OO 编程:什么是类,什么是实例,......
【讨论】:
好的,感谢您的提示。但我不能 100% 确定我将在哪里实施这些代码。 代替不编译的行。顺便说一句,您可能已经注意到如何在viewDidLoad
方法实现中将视图添加为子视图的工作示例。【参考方案2】:
编辑:
首先,不要将你的班级命名为MapViewController
。那已经是一种视图控制器,所以你应该自己命名(我将其称为JLMapView
,使用我的首字母缩写)。由于您尝试将MapViews
添加到单元格中,因此您也不应该继承UIViewController
的形式。相反,只需让您的 JLMapView
继承自 UIView
。
因此,您的类声明应如下所示:
class JLMapView: UIView
//etc..
试试这个MapCell1
:
class MapCell1: MapCell, MKMapViewDelegate
var mapView = JLMapView()
override func setupViews()
backgroundColor = UIColor.blueColor()
addSubview(mapView)
这样,您将添加JLMapView
的实例。您最初在 addSubviews
中拥有类类型,这让 Swift 感到困惑,因为它不能添加对象类型,它需要对象的特定实例。这就像去汽车经销商处,而不是要求一辆 SUV 或轿车或这辆车或那辆车,你要求一个“汽车”作为一个想法。如果您仍然感到困惑,请认真考虑查看面向对象的编程概念,特别是 data modeling
祝你好运,如果还是不行,请告诉我们原因
结束编辑
如果我正确阅读了问题,那么您正在尝试将视图控制器类型添加为子视图,而您不能这样做。您应该发送视图的实例,而不是对象的类型。如果您不明白,那是一个单独的问题,您应该使用 OOP 概念,例如 what an object is vs what an object type is。不幸的是,我不知道您要做什么,因此我无法提供完整的解决方案。
你的MapCell
s 是什么?他们应该是UITableViewCell
s 吗?您是否尝试将 MapViews
添加到单个单元格?
请详细说明,我会进一步帮助您
【讨论】:
是的,我正在尝试在单个单元格中添加 MapView。这是一个 UICollectionViewCell【参考方案3】:MapViewController 是控制器类型。当您键入“MapViewController”时,就像键入“Int”一样。您指的是类型,而不是它的特定版本。
想象一下,如果我说
let a = 3 + Int
你不想知道 Int 加到 3 上吗?在这个类比中,你想添加一个控制器视图的实例
另外,我很好奇你为什么不想使用 Storyboard
【讨论】:
是的,我知道它为什么不起作用。我忘了提那个。我在youtube上看到一个教程没有使用Storyboard,忘记是什么原因在哪里。但我只是在尝试不同的东西,我也使用了一点 Storybard... 我明白了。正如imak 所说,在这种情况下,您需要创建一个控制器实例,然后将其视图添加为子视图 好的,我用谷歌搜索了一下,但我不知道在哪里可以写出阿玛克写的这些代码。 在 setupViews() 中,将 addSubview(MapViewController) 替换为 let mapViewController = MapViewController() self.view.addSubview(mapViewController.view)。您需要了解为什么会这样或将来的工作会很困难 好的,我实现了这些代码我得到一个新的错误:'MapCell1'类型的值没有成员'view'以上是关于无法将类型“(MapViewController).Type”(又名“MapViewController.Type”)的值转换为预期的参数类型“UIView”的主要内容,如果未能解决你的问题,请参考以下文章
从 MapViewController 调用 UINavigationController