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

添加到可变数组的注释属于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];

}

最佳答案

您需要从favoriteAnnotationsArray中指定一个唯一注释,以便成功将其删除。

也许您可以尝试以下操作:

-(void)removeAnnotationFromFavoriteAnnotationsArrayWithTitle: (NSString *) titleString {
    for(int i=0; i<self.favoriteAnnotationsArray.count; i++) {
        MKPointAnnotation *annotation = (MKPointAnnotation *)[self.favoriteAnnotationsArray objectAtIndex:i];
        NSString * annotationTitle = annotation.title;
        if([annotationTitle isEqualToString:titleString]) {
            [self.favoriteAnnotationsArray removeObject:annotation];
            break;
        }
    }
}

如果title的唯一性不足以区分注解,则可以考虑对MKAnnotation进行子类化,并添加一个唯一的属性,然后将其传递给上述函数而不是title。

09-25 22:14