- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一系列的地方。这些地方中的每一个都显示在同一屏幕上的 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
类型,则唯一可用的属性是 title
、subtitle
和 coordinate
.
如果这些对您不起作用(例如,如果您可以使用相同的 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/
我是一名优秀的程序员,十分优秀!