从Mutable数组中删除MKPointAnnotation对象

时间:2016-04-30 19:17:28

标签: ios dictionary annotations

我有一个地图应用程序,允许用户将注释保存为可变数组的收藏夹。然后,当用户选择时,可以显示所有喜爱的注释。

添加到mutable数组的注释属于MKPointAnnotation类。我可以正确地向可变数组添加注释,但是我没有提出一个正确删除可变数组中特定注释的工作解决方案。如何从包含多个注释保存为收藏夹的可变数组中删除特定注释?我的示例代码中提供了几种非工作解决方案。

//** Correctly adds a favorite annotation to the mutable array favoriteAnnotationsArray **
-(void)addToFavoriteAnnotationsArray{
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    NSArray *components = [favoritesString componentsSeparatedByString:@","];
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]);
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];

    [self.favoriteAnnotationsArray addObject:annotation];

}
//** Need to remove a favorite annotation from the mutable array favoriteAnnotationsArray **
-(void)removeObjectFromFavoriteAnnotationsArray{

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    NSArray *components = [favoritesString componentsSeparatedByString:@","];
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]);
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];

    //** Used in first non-working solution below **
    //NSMutableArray *objectToRemoveArray = [[NSMutableArray alloc] init];
    //[objectToRemoveArray addObject:annotation];

    //** The following three lines didn't remove any annotations from array **
    //[self.favoriteAnnotationsArray removeObjectsInArray:objectToRemoveArray];
    //[self.favoriteAnnotationsArray removeObject:annotation];
    //[self.favoriteAnnotationsArray removeObjectIdenticalTo:annotation];

    //** This only removes the last object in array and not necessarily the correct annotation to remove **
    [self.favoriteAnnotationsArray removeLastObject];

}

2 个答案:

答案 0 :(得分:1)

您需要从function wait() { setTimeout(100); } function close() { var closed = 1; var opened = 19; var gate = opened; while (gate !== closed) { gate-=1; gate.style.paddingTop = open'%'; wait(); } } 指定一个唯一的注释,以便成功删除。

也许您可以尝试以下内容:

favoriteAnnotationsArray

如果title不足以区分注释,那么您可以考虑继承MKAnnotation并添加一个唯一属性并将其传递给上述函数而不是标题。

答案 1 :(得分:0)

一种方法是迭代注释数组并找到要删除的注释数组。例如:

- (void)addToFavoriteAnnotationsArray:(NSString *)string {
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    NSArray *components = [string componentsSeparatedByString:@","];
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]);
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];

    [self.favoriteAnnotationsArray addObject:annotation];
}

- (void)removeObjectFromFavoriteAnnotationsArray:(NSString *)string {
    NSArray *components = [string componentsSeparatedByString:@","];
    NSString *titleOfAnnotationToRemove = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
    CLLocationCoordinate2D coordinateOfAnnotationToRemove = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]);

    for (NSInteger i = 0; i < self.favoriteAnnotationsArray.count; i++) {
        id<MKAnnotation>annotation = self.favoriteAnnotationsArray[i];
        if ([annotation.title isEqualToString:titleOfAnnotationToRemove] && coordinateOfAnnotationToRemove.latitude == annotation.coordinate.latitude && coordinateOfAnnotationToRemove.longitude == annotation.coordinate.longitude) {
            [self.favoriteAnnotationsArray removeObjectAtIndex:i];
            break;
        }
    }
}

或者,如果您想单独匹配标题,请从上面的if语句中删除坐标。另请注意,我已将字符串作为参数添加到这些方法中。将参数传递给方法而不是依赖某些属性总是更好。

但是,坦率地说,当用户选择一个要删除时,您可能不希望他们必须再次手动输入名称和坐标。您可能希望他们从列表中选择一个。因此,您可以向他们展示注释的表格视图,当他们说他们想要删除第三个注释时,您只需将索引传递给这样的方法:

- (void)removeObjectFromFavoriteAnnotationsArray:(NSInteger)index {
    [self.favoriteAnnotationsArray removeObjectAtIndex:index];
}

顺便说一句,所有上述例程都会从数组中删除注释。如果您还将此注释添加到地图视图中,请记住将其从那里删除。