以编程方式从数组中选择地图注释

时间:2014-02-27 17:02:15

标签: ios mkmapview mapkit mkannotation

我有一系列的地方。这些位置中的每一个都显示在MapView和同一屏幕上的TableView上。当我点击表格视图上的相应行时,我想弹出一个地方的引脚注释。

我有以下代码来填充注释:

for (int i = 0; i < [self.myPlaces count]; i++)
    {
        MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
        SPlaces *ev = [self.myPlaces objectAtIndex:i];
        point.coordinate = CLLocationCoordinate2DMake([ev.location.latitude doubleValue], [ev.location.longitude doubleValue]);
        point.title = ev.title;
        point.subtitle = ev.type.name;
        [self.myMap addAnnotation:point];
    }

和此代码在TableView上选择行时显示注释:

//row = tapped row on TableView
    [self.myMap selectAnnotation:[[self.myMap annotations] objectAtIndex:row] animated:YES];

问题是注释似乎在myMap注释数组中有一个随机索引。 我的意思是,我想有这种行为:

users taps row 0 on Table view => annotation of pin 0 pops up on the map
users taps row 1 on Table view => annotation of pin 1 pops up on the map
users taps row 2 on Table view => annotation of pin 2 pops up on the map

但不是这样,我得到:

users taps row 0 on Table view => annotation of pin 1 pops up on the map
users taps row 1 on Table view => annotation of pin 0 pops up on the map
users taps row 2 on Table view => annotation of pin 2 pops up on the map

...或每次重新启动应用程序时更改的任何其他随机组合。 请注意,如果我启用用户的位置,我的其中一个引脚注释可以随机更改其“当前位置”的标题。

我很确定我会注意正确填充或访问注释。你有什么线索吗?

谢谢!

编辑:这篇文章似乎说你必须扫描你的注释数组,寻找匹配的标题,然后选择相关的注释:Open Map Annotation from Selected Row in Table View 这真的是唯一的方法吗?由于两个引脚可能共享相同的标题,因此看起来有点危险...

1 个答案:

答案 0 :(得分:1)

不保证地图视图的annotations数组按照添加的顺序返回注释。

部分原因是如果您将showsUserLocation设置为YES,则地图视图返回的annotations数组包含用户位置注释,即使您没有自己明确地调用addAnnotation。地图视图在内部添加了注释,因此您无法控制订单。

另一个原因很简单,文档并没有说数组将按任何特定顺序排列。

有关详细信息,请参阅MKMapView annotations changing/losing order?


正如您所链接的答案所示,一个选项是搜索annotations数组,直到找到符合条件的那个数组。

如果您的注释类型为MKPointAnnotation,则唯一可用的属性为titlesubtitlecoordinate

如果这些不适合您(例如,如果您可以使用相同的title注释),则需要使用具有每个注释唯一属性的自定义注记类。


但是,请注意,注释类不必是与基础数据模型类不同的类(例如SPlaces)。

如果您的SPlaces实现MKAnnotation协议本身,它可以简化问题。然后:

  • 您不需要遍历self.myPlaces并创建单独的注释对象。相反,您只需要一行[self.myMap addAnnotations:self.myPlaces];

  • 您无需搜索地图视图的annotations数组即可找到您的SPlaces对象。相反,在didSelectRowAtIndexPath中,您可以这样做:

    [self.myMap selectAnnotation:[self.myPlaces objectAtIndex:row] 
                        animated:YES];