Objective c 如何启动mapView:didSelectAnnotationView

Objective c 如何启动mapView:didSelectAnnotationView,objective-c,mkmapview,Objective C,Mkmapview,我对iPhone开发还不熟悉。我一直在阅读一些关于如何使google maps注释标注窗口接受换行的问题。我读过的每个教程都要求我启动mapView:didSelectAnnotationView方法。但我不知道怎么触发这个。我试过的东西包括 将该方法放入扩展UIViewController的my MapViewController.m文件中 将该方法放入一个MapView.m文件中,该文件扩展了MKMapView,然后让我的故事板中的MyMapView元素引用它作为要使用的类 关于xcod

我对iPhone开发还不熟悉。我一直在阅读一些关于如何使google maps注释标注窗口接受换行的问题。我读过的每个教程都要求我启动
mapView:didSelectAnnotationView
方法。但我不知道怎么触发这个。我试过的东西包括

  • 将该方法放入扩展UIViewController的my MapViewController.m文件中
  • 将该方法放入一个MapView.m文件中,该文件扩展了MKMapView,然后让我的故事板中的MyMapView元素引用它作为要使用的类
关于xcode、objective c和iphone开发的内容太多了,我不明白,所以我不知道我的问题出在哪里

目前,我的地图确实在所需位置绘制了所需标记。我只需要了解如何启动
mapView:didSelectAnnotationView
mapView:viewForAnnotation
功能,然后才能开始自定义调用框


是否有人有关于如何触发这些功能的分步说明?

地图视图:didSelectAnnotationView
是地图视图的一种委托方法,您可以在此处阅读:

您不需要调用它,映射视图将“自行”调用它,并将其发送给注册为其代理的每个视图/视图控制器

您需要做什么

基本上,您需要在.h文件中添加MKMapViewDelegate,如下所示:

@interface someViewController : UIViewController  <MKMapViewDelegate>
从这一点上,控制器将能够从地图视图“接收消息”,这些方法可以在我链接到的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. 
 }
发生了什么事

在后台发生的是:

  • 地图视图有一个处理AnnotationView触摸事件的方法(Apple编码)
  • 当触摸事件发生时,它会向其所有代表发送一条“消息”,告诉他们“嘿,用户是否选择了此地图上的注释视图,请根据需要使用它”。 通常看起来是这样的:

     [self.delegate mapView:someMapView didSelectAnnotationView:someAnnotationView];
    
  • 然后,将自身指定为委托并实现该方法的每个视图/控制器都将调用该方法

  • 祝你好运

    一点背景知识 需要注意的几点:

  • 您不需要调用
    mapView:didSelectAnnotationView
    。MKMapView在其委托上调用该函数。换句话说,当你建立一个MKMapView时,你告诉它:“嘿,听着,任何时候你需要告诉我地图上发生了什么,去告诉这个家伙,他会帮你处理的。”。“guy”是委托对象,它需要实现
    mapView:didSelectAnnotationView
    (这也是它的名称“did select”的原因,即它已经发生了,而不是“select”)。对于一个简单的例子,委托通常是拥有MKMapView的
    UIViewController
    ,这就是我将在下面描述的

  • 然后,当用户点击其中一个注释时,就会触发该方法。因此,这是一个很好的开始定制当他们点击注释视图(例如更新选择)时应该发生什么的地方

  • 然而,如果您想要自定义要显示的注释,这并不是您想要的,这听起来像是您真正想要的。对于这一点,在前面几段中有一种不同的方法:
    mapView:viewForAnnotation
    。因此,如果您发现
    mapView:didSelectAnnotationView
    不是您要查找的内容,请替换此方法

  • 你能做什么 如果你有一张带标记的地图,我猜你至少有: *视图控制器(从
    UIViewController
    扩展而来),以及 *已添加到该视图控制器视图中的
    MKMapView
    ,例如名为
    mapView

    要激发的方法定义为
    MKMapViewDelegate
    协议的一部分。 最简单的接线方式是:

    • 使UIViewController成为MKMapView的代理

      • 在代码中,在
        MapViewController.m的
        viewDidLoad
        中说,您可以执行
        mapview.delegate=self
        ,或者
      • 在Interface Builder中,可以将连接从MKMapView委托属性拖动到文件的所有者
    • 然后,在UIViewController上定义一个名为
      mapView:didSelectAnnotationView
      的方法,在
      MapViewController.m
      文件中声明它,就像协议一样:

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

    祝你好运!

    天哪,你是某个平行宇宙中的我吗?我发誓,当我点击“发布”时,我看到了新的答案横幅。即使是最后的“祝你好运”,希什。我也会是一个伪君子,不会投上高票!谢谢,我用你的答案和克汉让事情变得令人惊讶。+1感谢你的诚实和好答案。是的,我是你的翻版者(bahhhh)好的帖子解释了提供的答案。在这里,您只编写了没有解释的代码
    Place *place = [[Place alloc] init];
    PlaceMark *placeMark = [[PlaceMark alloc] initWithPlace:place];
    [self.mapView selectAnnotation:placeMark animated:YES];
    
    Place *place = [[Place alloc] init];
    PlaceMark *placeMark = [[PlaceMark alloc] initWithPlace:place];
    [self.mapView selectAnnotation:placeMark animated:YES];