如何重新排序MKMapView注释数组

时间:2012-10-22 18:17:54

标签: objective-c annotations mkmapview mapkit

我想重新排序地图上显示的注释数组,以便创建一个next / prev按钮,使用简单的迭代器快速遍历所有注释(按日期排序)。

据我所知,用作商店 [worldmap annotations] 的注释数组不可变,因此我无法重新排序。我尝试了以下操作来创建注释数组的临时副本,按日期对其进行排序并重新附加它。

worldmap 是我的MKMapView对象)

//COPY
 NSMutableArray *annotationSort = [[NSMutableArray alloc]initWithArray:[worldmap annotations]];

//SORT
[annotationSort sortedArrayUsingComparator:^NSComparisonResult(EventPin* obj1, EventPin* obj2) {
     return [obj1.eventItemObject.eventDateBegin compare: obj2.eventItemObject.eventDateBegin];
 }];

//ADDED SORTED ARRAY
[worldmap removeAnnotations:[worldmap annotations]];
[worldmap addAnnotations:annotationSort];

这似乎不起作用。任何想法如何重新排序MKMapKit注释数组?

1 个答案:

答案 0 :(得分:1)

正如linked question中提到的答案一样,无法保证地图视图的annotations属性会保留任何订单。

此外,由于annotations属性包含 userLocation,如果您showsUserLocation已启用(但您自己没有明确地调用addAnnotation annotations 1}} for),注释顺序将不是你所期望的。

不要依赖地图视图annotationSort数组中注释的顺序

相反,请保留您自己的注释数组并按照您想要的方式对其进行排序(例如annotations数组)。
但是将它们从地图上移除并添加回来是没有意义的。

请注意,地图视图的MKUserLocation数组可能包含[annotationSort sortedArrayUsingComparator:... 注释,因此在构建数组时,请在包含每个注释或访问自定义属性之前检查每个注释的类型。


但是,请注意对数组进行排序的代码:

sortedArrayUsingComparator

本身存在缺陷,因为NSArray 返回 NSMutableArray 它不会就地排列数组。

相反,要对sortUsingComparator进行排序,请调用其{{1}}方法。


使用此排序数组,您的应用程序可以按所需顺序访问或选择注释。