【发布时间】:2011-12-28 04:56:29
【问题描述】:
我正在尝试理解 MKMapView 类
MKMapView 的属性之一是注解。 但是MVC的前提不就是Views不拥有数据吗?
在我看到的类的示例实现中,注解属性实际上是在包含 mapview 对象的 MapViewController.h 中声明的。那么,注解又如何是 MapView 的一个属性呢。
如果我的任何假设/理解有误,请指出。 谢谢
【问题讨论】:
我正在尝试理解 MKMapView 类
MKMapView 的属性之一是注解。 但是MVC的前提不就是Views不拥有数据吗?
在我看到的类的示例实现中,注解属性实际上是在包含 mapview 对象的 MapViewController.h 中声明的。那么,注解又如何是 MapView 的一个属性呢。
如果我的任何假设/理解有误,请指出。 谢谢
【问题讨论】:
MKMapView 的属性之一是注解。但不是前提 MVC 是 Views 不拥有数据吗?
诸如地图视图之类的视图不应该管理数据——也就是说,它不应该知道或关心数据的来源,也不应该担心保存数据等。但在大多数情况下,这很难一个视图知道如何绘制自己而不知道应该在视图中表示什么数据。除非您告诉它标签的文本应该是什么,否则您不能期望标签将正确的字符放在屏幕上,对吗?注释也是如此。地图视图不知道也不关心他们来自哪里或他们属于哪一类。只要他们实现了 MKAnnotation 协议,地图视图就很开心。当然,它必须保留已添加到地图中的所有注释,但它不需要知道关于它们的任何其他信息。
在我见过的类的示例实现中,注释 属性实际上是在 MapViewController.h 中声明的,它包含 地图视图对象。
地图视图控制器通常也需要了解注释。毕竟,通常是控制器首先管理注释并将它们添加到地图中。此外,视图控制器通常是充当地图视图委托的对象,因此当有人点击注解的附件时,它是必须响应的对象。
那么注解怎么可能是 MapView 的一个属性呢。
MKMapView 负责为地图上显示的地理区域显示正确的注释。为此,它需要知道所有可以显示的注释。您可以添加您希望地图在相关区域可见时显示的注释,并且您不必在每次地图区域更改时确定哪些是可见的。为了做到这一点,地图显然必须跟踪所有已添加的注释。
本不该如此。 MKMapView 可以像 UITableView 一样实现;它本可以要求代表为给定区域显示数据。正如 UITableViewDataSource 有-tableView:cellForRowAtIndexPath: 一样,MKMapDelegate 也可以有一个-mapView:annotationsForRegion: 方法。但是如果这样做的话,每个地图代表都必须能够有效地找到给定区域的注释,并且为了提供正确的集合,SO 将有很多关于如何正确实现四叉树的问题地图视图的注释。将所有这些逻辑放在 MKMapView 中使该类更易于使用。而且由于 MKMapView 不管理注解,因此没有违反 MVC。
【讨论】: