2014-02-27 33 views
1

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

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

我很确定我正在填写或正确访问注释。你有任何线索吗?

谢谢!

编辑:这篇文章似乎是说,你要扫描您的注解阵列,寻找匹配的标题,然后选择相应的注解:Open Map Annotation from Selected Row in Table View 这真的是唯一的出路?由于两个引脚可能共享相同的标题,所以看起来有点危险......

+0

你应该能够行值分配到注解的'tag'和与之相匹配上,而不是冠军? – Flexicoder

+0

MKPointAnnotation没有任何“标签”属性。也许我将不得不使用自定义AnnotationView ... –

+0

对不起,我已经使用'MKPinAnnotationView'在过去有标签。我想知道如果你可以使用'[self.myMap viewWithTag:]'来获得正确的并且选择它吗? – Flexicoder

回答

1

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

这部分是由于这样的事实,如果你有showsUserLocation设置为YES,由地图视图返回的annotations阵列包括用户位置标注,即使你没有显式调用addAnnotation它自己。地图视图在内部添加了注释,因此您无法控制订单。

另一个原因是,文档没有说数组将按任何特定的顺序。

有关更多详细信息,请参见MKMapView annotations changing/losing order?


作为您建议链接的答案,一个选项是搜索annotations数组,直到找到您要查找的符合条件的数组。

如果您的注释类型为MKPointAnnotation,唯一可用的属性是title,subtitlecoordinate

如果这些不适用于您(例如,如果您可以使用相同的注释title),则需要使用具有每个注释唯一属性的自定义注记类。


但是,请注意,注释类不是从底层数据模型类(如SPlaces)不同的类。

它可以简化问题,如果你的SPlaces实现MKAnnotation协议本身。然后:

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

  • 您无需搜索地图视图的annotations数组即可找到您的SPlaces对象。相反,在didSelectRowAtIndexPath,你将能够只是这样做:

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

MKAnnotation协议看起来非常酷,我会尝试。谢谢 ! –

+0

@Anna我认为我在某种程度上遇到了与此问题相关的问题。我真的需要有人帮助看看[我的问题](http://stackoverflow.com/questions/28144466/how-to-select-map-pin-when-tapping-table-row-that-associates-with-it )并让我知道什么是错的或我错过了什么。我很初学,所以真的需要一些指导。你能帮我解决吗?谢谢。 – SanitLee