【问题标题】:Select a map annotation from array programatically以编程方式从数组中选择地图注释
【发布时间】:2014-02-27 17:02:14
【问题描述】:

我有很多地方。这些地方中的每一个都显示在同一屏幕上的 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

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

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

谢谢!

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

【问题讨论】:

  • 您应该能够将行值分配给 Annotation 的 tag 并匹配它而不是标题?
  • MKPointAnnotation 没有任何“标签”属性。也许我将不得不使用自定义 AnnotationView...
  • 啊抱歉,我以前用过MKPinAnnotationView,它确实有标签。我想知道在那之后您是否可以使用[self.myMap viewWithTag:] 来获取正确的并以这种方式选择它?

标签: ios mkmapview mapkit mkannotation


【解决方案1】:

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

这部分是因为如果您将showsUserLocation 设置为YES,则地图视图返回的annotations 数组包含用户位置注释,即使您没有' t 自己显式调用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];
    

【讨论】:

  • MKAnnotation 协议看起来很酷,我会试试的。谢谢!
  • @Anna 我想我在某种程度上遇到了与这个问题相关的问题。我真的需要有人帮助调查my question,让我知道哪里出了问题或我错过了什么。我是初学者,所以在这里真的需要一些指导。你能帮帮我吗?谢谢。
猜你喜欢
  • 2023-04-11
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多