Вопрос по objective-c – как запустить mapView: didSelectAnnotationView

3

Я новичок в разработке для iPhone. Я читал несколько вопросов о том, как сделать, чтобы окно с надписью аннотации карты Google принимало разрывы строк. Каждый учебник, который я прочитал, требует от меняmapView:didSelectAnnotationView метод. Но я понятия не имею, как это вызвать. вещи, которые я пробовал включать

  • putting the method in my MapViewController.m file which extends UIViewController
  • putting the method in a MapView.m file which extends MKMapView, then have my Mapview element in my storyboard reference it as the class to use

Там так много о разработке xcode, target c и iphone, что я не понимаю, так что я не могу сказать, в чем заключается моя проблема.

На данный момент моя карта наносит желаемый маркер на нужное место. Мне просто нужно понять, как уволитьmapView:didSelectAnnotationView а такжеmapView:viewForAnnotation функции, прежде чем я могу начать настраивать поле вызова.

У кого-нибудь есть пошаговые инструкции по запуску этих функций?

Ваш Ответ

3   ответа
9

A bit of background

You don't call mapView:didSelectAnnotationView. The MKMapView calls that function on it's delegate. In other words, when you set up an MKMapView, you tell it: "hey, listen, anytimme you need to tell me what's happening on the map, go tell this guy, he'll handle them for you". That "guy" is the delegate object, and it needs to implement mapView:didSelectAnnotationView (that's also why its name "did select", ie, it already happened, as opposed to "select"). For a simple case, the delegate is often the UIViewController that owns the MKMapView, which is what I'll describe below.

That method will then get triggered when the user taps on one of your annotations. So that's a great spot to start customizing what should happen when they tap on an annotation view (updating a selection, for instance).

It's not, however, what you want if you want to customize what annotation to show, which is what it sounds like you're actually after. For that, there's a different method just a few paragraphs earlier on the same man page: mapView:viewForAnnotation. So substitute this method if you find that mapView:didSelectAnnotationView isn't what you were looking for.

What you can do

Если вы добрались до карты с маркером, я предполагаю, что у вас есть по крайней мере: * контроллер вида (расширяется отUIViewController, а также * анMKMapView что вы добавили в представление для этого контроллера представления, скажем, по имениmapView

Метод, который вы хотите запустить, определяется как частьMKMapViewDelegate протокол. Самый простой способ получить этот провод - это:

make your UIViewController the delegate for you MKMapView

in code, say in your viewDidLoad, of your MapViewController.m you could do mapview.delegate = self, OR in Interface Builder, you could drag the connection from the the MKMapView delegate property to the file's owner

then, define a method on your UIViewController called mapView:didSelectAnnotationView, declaring it just like the protocol does, in your MapViewController.m file:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
    // whatever you need to do to your annotation and/or map
}

Удачи!

+1 назад к вам за вашу честность и хороший ответ. и да, я твой двойник (баххххх)
0

Place *place = [[Place alloc] init];
PlaceMark *placeMark = [[PlaceMark alloc] initWithPlace:place];
[self.mapView selectAnnotation:placeMark animated:YES];
Хорошие посты объясняют предоставленный ответ. Здесь вы только что написали код без объяснения причин.
2

mapView:didSelectAnnotationView Ссылка на протокол MKMapViewDelegate

Вам не нужно называть это, представление карты будет называть это "само по себе". и отправлять его каждому контроллеру представления / просмотра, который зарегистрирован как его делегат.

What do you need to do

В основном вам нужно добавить MKMapViewDelegate в ваш файл .h, что будет выглядеть примерно так:

@interface someViewController : UIViewController  <MKMapViewDelegate>

Затем в файле .m после создания экземпляра карты вы должны добавить:

mapView.delegate = self;//were self refers to your controller

С этого момента и ваш контроллер сможет «получать сообщения» из вида карты, которые представляют собой методы, которые вы можете увидеть в ссылке MKMapViewDelegate, с которой я связан.

Поэтому для реализации mapView: didSelectAnnotationView вам нужно добавить в ваш файл .m

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
     //if you did all the steps this methosd will be called when a user taps the annotation on the map. 
 }

What is happening

Что происходит в фоновом режиме:

The map view has a method (Apple codded) that handles the AnnotationView touch events.

When a touch event take place it sends a "message" to all of it's delegates saying "Hey a user did Select Annotation View on this map, Do with it what ever you need". usually it looks like that:

 [self.delegate mapView:someMapView didSelectAnnotationView:someAnnotationView];

Then every view/controller that assigned itself as a delegate and implemented the method will cal this method.

Удачи

Боже мой, вы меня в какой-то параллельной вселенной? Клянусь, я увидел баннер с новым ответом, когда добрался до кнопки "опубликовать". Даже "удачи" в конце, шиш. Я был бы лицемером, чтобы не поддерживать!
Спасибо, я использовал ваш ответ и ckhan, чтобы получить работу. John

Похожие вопросы