gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:52:35 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com