Почему MKMapView имеет NSObject как свойство - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь понять класс MKMapView

На основании документации: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

Одним из свойств MKMapView являются аннотации. Но разве не предпосылка MVC заключается в том, что представлениям не принадлежат данные?

В примере реализации класса, который я видел, свойство аннотации было фактически объявлено в MapViewController.h, которое охватывает объект mapview. Так как же аннотация даже свойство MapView.

Пожалуйста, укажите, верно ли какое-либо из моих предположений / пониманий. Спасибо

1 Ответ

1 голос
/ 28 декабря 2011

Одним из свойств MKMapView являются аннотации. Но не предпосылка MVC, что представления не владеют данными?

Представление, такое как представление карты, не должно управлять данными, то есть не должно знать или заботиться о том, откуда поступают данные, беспокоиться о сохранении и т. Д. Но в большинстве случаев это будет трудно представление, чтобы знать, как нарисовать себя, не зная, какие данные должны быть представлены в представлении. Вы не могли ожидать, что ярлык будет отображать правильные символы на экране, если вы не скажете, каким должен быть текст ярлыка, верно? То же самое с аннотациями. Вид карты не знает и не заботится о том, откуда они берутся и какой у них класс. Пока они реализуют протокол MKAnnotation, вид карты счастлив. Конечно, он должен сохранять любые аннотации, которые были добавлены на карту, но ему не нужно ничего больше знать о них.

В примере реализации класса, который я видел, аннотация свойство было фактически объявлено в MapViewController.h, которое охватывает объект mapview.

Контроллер вида карты часто также должен знать об аннотациях. В конце концов, обычно контроллер управляет аннотациями и добавляет их на карту. Кроме того, контроллер представления обычно является объектом, который действует как делегат представления карты, поэтому именно этот объект должен реагировать, когда кто-то касается аксессуара аннотации.

Так как же аннотация даже является свойством MapView.

MKMapView заботится о отображении правильных аннотаций для географической области, отображаемой на карте. Для этого ему нужно знать all аннотации, которые могли бы отображаться . Вы добавляете аннотации, которые вы хотите, чтобы карта отображала, когда ассоциированная область видна, и вам не нужно выяснять, какие из них видны при каждом изменении области карты. Чтобы сделать это, карта, очевидно, должна отслеживать все аннотации, которые были добавлены.

Так не должно быть. MKMapView мог быть реализован как UITableView; он мог запросить у делегата данные для отображения для данной области. Так же, как UITableViewDataSource имеет -tableView:cellForRowAtIndexPath:, MKMapDelegate мог иметь -mapView:annotationsForRegion: метод. Но если бы это было сделано таким образом, каждый делегат карты должен был бы иметь возможность эффективно находить аннотации для данного региона, а у SO были бы десятки вопросов о том, как правильно реализовать квадра-дерево для обеспечения правильного набора аннотаций к представлению карты. Использование всей этой логики в MKMapView делает класс намного проще в использовании. А поскольку MKMapView не управляет аннотациями, никакого нарушения MVC нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...