相当新的快速..
我在viewController类中有以下代码:
var mapView: MKMapView!
override func loadView() {
mapView = MKMapView()
view = mapView
let london = Capital(coordinate: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275))
let washington = Capital(coordinate: CLLocationCoordinate2D(latitude: 38.895111, longitude: -77.036667))
// works fine
mapView.addAnnotation(london)
// raises an error: Value of type 'UIView' has no member 'addAnnotation'
view.addAnnotation(washington)
}
我想了解为什么 mapView 有一组不同于 view 的方法,即使我们明确说明 view = mapView < / p>
查看是viewController类中的特殊变量吗?
答案 0 :(得分:1)
由于您在Swift中定义变量的方式,会发生此行为。由于mapView
属于MKMapView
类型,它继承自UIView
(您可以查看文档here),因此它将具有UIView
所具有的所有功能加上MKMapView
类中定义的任何其他内容。由于此继承,view
能够保留mapView
,但认为它只是UIView
个对象。由于addAnnotation
功能仅在MKMapView
类中定义,而不在UIView
中定义,因此view
无法访问此<ng-form>
。
答案 1 :(得分:1)
view
是UIViewController
的属性,其类型为UIView
。 Documentation
MKMapView
是UIView
的子类,因此您可以将其分配给view
属性。通过继承,它具有UIView
的所有属性和方法(因为它 一个UIView
)以及其他特定的属性和方法,documented here
答案 2 :(得分:1)
每个UIViewController
都有它管理的UIView
个实例。 UIView
实例存储在view
的{{1}}属性中(摘自docs):
存储在此属性中的视图表示视图控制器的视图层次结构的根视图。
您要将UIViewController
设置为view
,以表示当前mapView
的{{1}}应该是viewController
个实例。由此,view
从现在开始管理mapView
(例如,在呈现viewController
时设置正确的框架。)
mapView
是viewController
类的一个实例。 mapView
子类MKMapView
,因此它继承了MKMapView
中的所有方法,但是,它增加了一些专门用于呈现和处理地图的方法。
答案 3 :(得分:1)
这与view
或mapView
IS无关,而是与它们的定义有关。
MKMapView
被定义为UIView
的子类,因此说这样的话完全有效......
let foo: UIView = MKMapView()
这将创建一个名为foo
的变量,它是MKMapView
但是你告诉编译器它是UIView
所以编译器只允许你运行函数和访问属性UIView
。
你可以这样做......
(foo as! MKMapView).addAnnotaion(...)
这会强制编译器将foo
视为MKMapView。还有更安全的方法可以做到这一点......(如果它实际上不是MKMapView,这会崩溃)。
更安全的方式......
if let mapView = foo as? MKMapView {
mapView.addAnnotation(...)
}
在您的实例中view
是UIviewController的一个属性,它被定义为UIView,这就是您收到错误的原因。