Ios 以编程方式从阵列中选择地图注释
我有很多地方。这些位置中的每一个都显示在同一屏幕上的地图视图和表格视图上。我想在点击表视图上相应的行时弹出一个位置的pin注释 我有以下代码来填充注释:Ios 以编程方式从阵列中选择地图注释,ios,mkmapview,mapkit,mkannotation,Ios,Mkmapview,Mapkit,Mkannotation,我有很多地方。这些位置中的每一个都显示在同一屏幕上的地图视图和表格视图上。我想在点击表视图上相应的行时弹出一个位置的pin注释 我有以下代码来填充注释: for (int i = 0; i < [self.myPlaces count]; i++) { MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; SPlaces *ev = [self.myPlaces objectAtIn
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];
}
问题是注释在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注释可以将其标题随机更改为“当前位置”
我很确定我正在正确地填充或访问注释。你有什么线索吗
谢谢
编辑:这篇文章似乎说,您必须扫描注释数组,寻找匹配的标题,然后选择相关注释:
这真的是唯一的办法吗?由于两个管脚可能共享同一标题,这似乎有点危险…地图视图的
注释数组不能保证按添加注释的顺序返回注释
部分原因是,如果将showsUserLocation
设置为YES
,则地图视图返回的annotations
数组包括用户位置注释,即使您自己没有显式调用addAnnotation
。地图视图在内部添加该注释,因此您无法控制顺序
另一个原因很简单,文档中没有说数组将按任何特定顺序排列
有关更多详细信息,请参阅
正如您链接到的答案所示,一个选项是搜索注释
数组,直到找到与条件匹配的注释
如果批注的类型为MKPointAnnotation
,则唯一可用的属性是标题
、副标题
、和坐标
如果这些不适用于您(例如,如果您可以使用相同的标题
),则需要使用自定义注释类,该类具有每个注释唯一的属性
但是,请注意,注释类不必与基础数据模型类不同(例如,SPlaces
)
如果SPlaces
类本身实现了MKAnnotation
协议,那么它可以简化问题。然后:
- 您不需要遍历
self.myPlaces
并创建单独的注释对象。相反,您只需要一行[self.myMap addAnnotations:self.myPlaces]代码>
- 无需搜索地图视图的
注释
数组即可找到SPlaces
对象。相反,在didSelectRowAtIndexPath
中,您可以只执行以下操作:
[self.myMap selectAnnotation:[self.myPlaces objectAtIndex:row]
animated:YES];
您应该能够将行值分配给批注的标记
,并与之匹配,而不是与标题匹配?MKPointAnnotation没有任何“tag”属性。也许我必须使用自定义注释视图…啊,对不起,我以前使用过MKPinAnnotationView
,它确实有标签。之后我想知道您是否可以使用[self.myMap viewWithTag:][/code>找到正确的一个并以这种方式选择它?MKAnnotation协议看起来非常酷,我会尝试一下。谢谢@安娜,我想我在某种程度上与这个问题有关。我真的需要有人帮助调查,让我知道什么是错的或我错过了什么。我是个初学者,所以这里需要一些指导。你能帮我一下吗?谢谢
[self.myMap selectAnnotation:[self.myPlaces objectAtIndex:row]
animated:YES];