1

我在我的 .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奥特莱斯在哪里。

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

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

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

4

1 回答 1

3

annotations属性 ofMKMapView不保证以您添加它们的相同顺序返回注释 。

假设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数组并搜索“最后一个”注释(或您感兴趣的任何属性)。一旦您引用了“最后一个”(可能不一定是数组中的最后一个对象),您就可以调用removeAnnotation它。这种方法假设您在注释对象本身中有一些属性,可以让您将注释标识为“最后一个”。这可能并不总是可能的。

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

于 2013-07-27T14:11:38.920 回答