ios - 以编程方式从数组中选择 map 注释

标签 ios mkmapview mapkit mkannotation

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

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

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 这真的是唯一的方法吗?由于两个图钉可能共享相同的标题,这似乎有点危险......

最佳答案

map View 的 annotations 数组不能保证按您添加注释的顺序返回注释。

部分原因是,如果您将 showsUserLocation 设置为 YES,则 map View 返回的 annotations 数组 包括用户位置注释,即使您自己没有明确调用 addAnnotation。 map View 在内部添加该注释,因此您无法控制顺序。

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

参见 MKMapView annotations changing/losing order?了解更多详情。


正如您链接到的答案所建议的那样,一种选择是搜索 annotations 数组,直到找到您要查找的符合条件的数组。

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

如果这些对您不起作用(例如,如果您可以使用相同的 title 注释),您将需要使用自定义注释类,该类具有每个注释唯一的属性.


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

如果您的SPlaces实现MKAnnotation 协议(protocol)本身,它可以简化事情。然后:

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

  • 您不需要搜索 map View 的 annotations 数组来找到您的 SPlaces 对象。相反,在 didSelectRowAtIndexPath 中,您可以这样做:

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

关于ios - 以编程方式从数组中选择 map 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22075292/

相关文章:

ios - Objective-C 不兼容的指针类型用类型为 'XYZShoutingPerson *' 的表达式初始化 'XYZPerson *'

ios - 无法从 JSON 获取单个结果

ios - 如何摆脱 iOS 14 中的 MKBalloonCalloutView

swift - swift mapview等待数据库

ios - 如何将数据传递给另一个 View

iOS 8 - 如何确定前台应用程序以及获取正在运行的应用程序列表

ios - 如何在应用程序购买中设置自动续订以满足 Apple 准则?

ios - 有没有办法以编程方式缩放 MKMapView 而不会捕捉到其预定义的缩放级别之一?

ios - 如何在另一个类中获取 map 注释属性?

MapKit JS 以编程方式选择注释