Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式从阵列中选择地图注释_Ios_Mkmapview_Mapkit_Mkannotation - Fatal编程技术网

Ios 以编程方式从阵列中选择地图注释

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

我有很多地方。这些位置中的每一个都显示在同一屏幕上的地图视图和表格视图上。我想在点击表视图上相应的行时弹出一个位置的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];
    }
问题是注释在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];