我正在尝试理解MKMapView类
MKMapView的一个属性是注释。 但不是MVC的前提是Views不拥有数据吗?
在我看过的类的示例实现中,annotation属性实际上是在包含mapview对象的MapViewController.h中声明的。那么注释甚至是MapView的属性。
请指出我的任何假设/理解是否错误。 感谢
答案 0 :(得分:1)
MKMapView的一个属性是注释。但不是前提 MVC是视图不拥有数据吗?
地图视图等视图不应该管理数据 - 也就是说,它不应该知道或关心数据的来源,担心保存数据等等。但在大多数情况下它&# 39; d很难让视图知道如何在不知道视图中应该表示什么数据的情况下绘制自己。你不能期望一个标签在屏幕上放置正确的字符,除非你告诉它标签的文字应该是什么,对吧?它与注释相同。地图视图不知道或关心它们来自何处或它们是什么类。只要他们实现MKAnnotation协议,地图视图就会很开心。当然,它必须保留已添加到地图中的任何注释,但它不需要了解有关它们的任何其他内容。
在我看过的类I的示例实现中,注释 属性实际上是在包含的MapViewController.h中声明的 mapview对象。
地图视图控制器通常也需要知道注释。毕竟,它通常是管理注释的控制器,并且首先将它们添加到地图中。此外,视图控制器通常是充当地图视图委托的对象,因此当有人点击注释的附件时,它是必须响应的对象。
那么注释甚至是MapView的属性。
MKMapView负责显示地图上显示的地理区域的正确注释。要做到这一点,它需要知道所有 可以显示的注释。您可以添加希望地图在关联区域可见时显示的注释,并且您不必在每次地图区域更改时找出哪些可见。为了做到这一点,地图显然必须跟踪已添加的所有注释。
它没有必须那样。 MKMapView可以像UITableView一样实现;它本可以要求代表为给定区域显示数据。就像UITableViewDataSource有-tableView:cellForRowAtIndexPath:
一样,MKMapDelegate可能有-mapView:annotationsForRegion:
方法。但如果以这种方式完成,每个地图代表都必须能够有效地找到给定区域的注释,并且为了提供正确的设置,SO会有关于如何正确实现四叉树的几十个问题。注释到地图视图。将所有逻辑放在MKMapView中使得类更容易使用。由于MKMapView不是管理注释,因此没有违反MVC。