了解设置视图

时间:2018-02-22 21:11:08

标签: ios swift

相当新的快速..

我在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类中的特殊变量吗?

4 个答案:

答案 0 :(得分:1)

由于您在Swift中定义变量的方式,会发生此行为。由于mapView属于MKMapView类型,它继承自UIView(您可以查看文档here),因此它将具有UIView所具有的所有功能加上MKMapView类中定义的任何其他内容。由于此继承,view能够保留mapView,但认为它只是UIView个对象。由于addAnnotation功能仅在MKMapView类中定义,而不在UIView中定义,因此view无法访问此<ng-form>

答案 1 :(得分:1)

viewUIViewController的属性,其类型为UIViewDocumentation

MKMapViewUIView的子类,因此您可以将其分配给view属性。通过继承,它具有UIView的所有属性和方法(因为它 一个UIView)以及其他特定的属性和方法,documented here

答案 2 :(得分:1)

每个UIViewController都有它管理的UIView个实例。 UIView实例存储在view的{​​{1}}属性中(摘自docs):

  

存储在此属性中的视图表示视图控制器的视图层次结构的根视图。

您要将UIViewController设置为view,以表示当前mapView的{​​{1}}应该是viewController个实例。由此,view从现在开始管理mapView(例如,在呈现viewController时设置正确的框架。)

mapViewviewController类的一个实例。 mapView子类MKMapView,因此它继承了MKMapView中的所有方法,但是,它增加了一些专门用于呈现和处理地图的方法。

答案 3 :(得分:1)

这与viewmapView 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,这就是您收到错误的原因。