如何删除mapView上的最后一个注释

时间:2013-07-26 23:02:22

标签: ios mkmapview mapkit mkannotation

我在.xib文件中添加了一个按钮,我想删除最后添加的注释。

所以在Touch-Down动作中我实现了这个:

-(IBAction)DeleteAnnotation:(id)sender {
   [mapview removeAnnotation:[mapview.annotations lastObject]];
}

我甚至用这种方式尝试过:

-(IBAction)DeleteAnnotation:(id)sender {
   [self.mapview removeAnnotation:self.mapview.annotations.lastObject]];
}

其中mapview是我的MKMapView插座。

我遇到的两个方面的问题是,在删除注释之前,我必须多次按下此特定按钮。

此外,注释会以一种非常随机的方式自行删除。

我做错了什么或是软件和模拟器问题?

1 个答案:

答案 0 :(得分:3)

annotations MKMapView属性不保证以您添加的注释顺序返回注释。

假设annotations数组属性将以您添加它们的相同顺序返回注释,这很可能是您看到的“奇怪”行为的原因。有关更多详细信息,请参阅这些相关答案:


为了获得你想要的行为(我假设它只是“删除我的代码明确添加的最后一个注释”),这里有三种可能的方法(可能还有其他方法):

  1. 最简单的方法是将强属性中的引用保留到您添加的最后一个注释(在调用addAnnotation时更新引用)。如果要删除“添加的最后一个注释”,请将保存的引用传递给removeAnnotation。例如:

    //in the interface...
    @property (nonatomic, strong) id<MKAnnotation> lastAnnotationAdded;
    
    //in the implementation...
    
    //when you add an annotation:
    [mapview addAnnotation:someAnnotation];
    self.lastAnnotationAdded = someAnnotation;  //save the reference
    
    //when you want to remove the "last annotation added":
    if (self.lastAnnotationAdded != nil)
    {
        [mapview removeAnnotation:self.lastAnnotationAdded];
        self.lastAnnotationAdded = nil;
    }
    
  2. 另一种选择是循环遍历地图视图的annotations数组,并搜索“最后”注释(或您感兴趣的任何属性)。一旦引用了“last”(可能不一定是数组中的最后一个对象),就可以在其上调用removeAnnotation。此方法假设您在注释对象本身中有一些属性,可以将注释标识为“最后”注释。这可能并非总是可行。

  3. 另一个选择是保留自己的注释数组,并在调用addAnnotation时向此数组添加注释对象。这类似于将单个引用仅保留为“添加的最后一个注释”,除非您按照可依赖的顺序跟踪整个列表。要删除“最后一个”,您将从数组中获取lastObject而不是地图视图(假设您按顺序保留数组)。在地图中添加/删除注释时,您必须确保数组保持同步。