3

我是 iPhone 开发的新手。我一直在阅读有关如何使谷歌地图注释标注窗口接受换行符的几个问题。我读过的每个教程都要求我触发该mapView:didSelectAnnotationView方法。但我不知道如何触发它。我尝试过的事情包括

  • 将该方法放在扩展 UIViewController 的 MapViewController.m 文件中
  • 将该方法放在扩展 MKMapView 的 MapView.m 文件中,然后让我的故事板中的 Mapview 元素将其引用为要使用的类

关于 xcode、objective c 和 iphone 开发的东西太多了,我不明白,所以我不知道我的问题出在哪里。

目前,我的地图确实在所需位置绘制了我想要的标记。在开始自定义调出框之前,我只需要了解如何触发 mapView:didSelectAnnotationViewand函数。mapView:viewForAnnotation

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

4

3 回答 3

9

一点背景

需要注意的几点:

  1. 你不打电话mapView:didSelectAnnotationView。MKMapView 在它的委托上调用该函数。换句话说,当你设置一个 MKMapView 时,你告诉它:“嘿,听着,任何时候你需要告诉我地图上发生了什么,去告诉这个人,他会为你处理它们”。那个“家伙”是委托对象,它需要实现mapView:didSelectAnnotationView(这也是为什么它的名字是“did select”,即它已经发生了,而不是“select”)。对于一个简单的情况,委托通常UIViewController是拥有 MKMapView 的人,这就是我将在下面描述的内容。

  2. 当用户点击您的一个注释时,该方法将被触发。因此,这是开始自定义当他们点击注释视图(例如更新选择)时应该发生的事情的好地方。

  3. 但是,如果您想自定义要显示的注释,这不是您想要的,这听起来像是您实际想要的。为此,在同一手册页的前几段中,有一种不同的方法:mapView:viewForAnnotation. 因此,如果您发现这mapView:didSelectAnnotationView不是您想要的,请替换此方法。

你可以做什么

如果您到达带有标记的地图,我猜您至少有: * 一个视图控制器(扩展自UIViewController, 和 *MKMapView您已添加到该视图控制器的视图中的mapView

您要触发的方法被定义为MKMapViewDelegate协议的一部分。最简单的方法是:

  • 让你的 UIViewController 成为你 MKMapView 的代表

    • 在代码中,比如在你的viewDidLoadMapViewController.m你可以做的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
    }
    

祝你好运!

于 2012-05-08T04:30:39.537 回答
2

mapView:didSelectAnnotationView是地图视图的委托方法,您可以在这里阅读: MKMapViewDelegate 协议参考

您不需要调用它,地图视图将“自行”调用它并将其发送到注册为其委托的每个视图/视图控制器。

你需要做什么

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

@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. 
 }

怎么了

在后台发生的事情是:

  1. 地图视图有一个处理 AnnotationView 触摸事件的方法(Apple 编码)。
  2. 当一个触摸事件发生时,它会向它的所有代表发送一条“消息”,说“嘿,一个用户在这张地图上选择了注释视图,用它做任何你需要的事情”。通常它看起来像这样:

     [self.delegate mapView:someMapView didSelectAnnotationView:someAnnotationView];
    
  3. 然后将自己分配为委托并实现该方法的每个视图/控制器都将调用此方法。

祝你好运

于 2012-05-08T04:29:22.063 回答
0
Place *place = [[Place alloc] init];
PlaceMark *placeMark = [[PlaceMark alloc] initWithPlace:place];
[self.mapView selectAnnotation:placeMark animated:YES];
于 2014-08-04T12:13:25.733 回答