我在.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
插座。
我遇到的两个方面的问题是,在删除注释之前,我必须多次按下此特定按钮。
此外,注释会以一种非常随机的方式自行删除。
我做错了什么或是软件和模拟器问题?
答案 0 :(得分:3)
annotations
MKMapView
属性不保证以您添加的注释顺序返回注释。
假设annotations
数组属性将以您添加它们的相同顺序返回注释,这很可能是您看到的“奇怪”行为的原因。有关更多详细信息,请参阅这些相关答案:
为了获得你想要的行为(我假设它只是“删除我的代码明确添加的最后一个注释”),这里有三种可能的方法(可能还有其他方法):
最简单的方法是将强属性中的引用保留到您添加的最后一个注释(在调用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;
}
另一种选择是循环遍历地图视图的annotations
数组,并搜索“最后”注释(或您感兴趣的任何属性)。一旦引用了“last”(可能不一定是数组中的最后一个对象),就可以在其上调用removeAnnotation
。此方法假设您在注释对象本身中有一些属性,可以将注释标识为“最后”注释。这可能并非总是可行。
另一个选择是保留自己的注释数组,并在调用addAnnotation
时向此数组添加注释对象。这类似于将单个引用仅保留为“添加的最后一个注释”,除非您按照可依赖的顺序跟踪整个列表。要删除“最后一个”,您将从数组中获取lastObject
而不是地图视图(假设您按顺序保留数组)。在地图中添加/删除注释时,您必须确保数组保持同步。