MKMapView viewForAnnotation,保存注释

时间:2012-06-07 04:58:26

标签: iphone mkmapview

根据我的理解,当您执行以下操作时:

[self.mapView addAnnotation:anAddress];

它为地图添加了一个注释,然后查看视图的委托方法,如下所示:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id<MKAnnotation>)annotation {
    static NSString *placeMarkIdentifier = @"SimplePinIdentifier";
    if ([annotation isKindOfClass:[AddressAnnotation class]]) {
        MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placeMarkIdentifier];
        if (annotationView == nil) {
            annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placeMarkIdentifier];
        }
        else {
            annotationView.annotation = annotation;
        }
        NSLog(@"my annotation: %@", [annotation description]);
        annotationView.enabled = YES;
        annotationView.animatesDrop = YES;
        annotationView.draggable = YES;
        annotationView.canShowCallout = YES;
        annotationView.tag = ANNOTATION_VIEW_TAG;

        UIButton *detailDisclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annotationView.rightCalloutAccessoryView = detailDisclosureButton;

        [self performSelector:@selector(showCallout:) withObject:annotation afterDelay:0.5];

        return annotationView;
    }
    return nil;
}

我正在使用更多iOS 5开发中的示例,并使用我自己的AddressAnnotation对象自定义我的调用。所以这部分按照我的预期运作。

当按下公开内容时,用户可以保存位置(它只是将其添加到数组中)。这样可行。因此,当我重新加载地图时,它会添加该注释。

我不明白的部分是,如果我将第一个引脚保存到地图后,我将引脚拖到屏幕上的其他位置。然后我再次保存它,我的数组有两个对象。由于我将第一个引脚从其原始位置拖出,因此当前的mapView只有一个引脚。当我尝试重新加载地图时,它在我拖动它的最后位置只有一个引脚。它没有我想象的两个引脚。我基本上只是这样做:

[self.mapView addAnnotations:_locations]; // where _locations is an array that stores my saved <MKAnnotation> objects

当我对_locations进行NSLog时,我看到了两个对象。我认为它会向地图添加两个引脚,因为代理被调用,并且会为屏幕中的每个对象添加一个引脚。但是当我在委托viewForAnnotation:中的NSLog时,它只被调用一次,对于我最后拖动的对象,而不是原始引脚。

这里发生了什么?谢谢!

编辑:

我保存位置的代码:

- (void)mapPickerDidSelectMap:(Map *)aMap {
    DataManager *dmgr = [DataManager sharedInstance];
    if (![dmgr locationExists:self.address forMap:aMap]) {
        NSMutableArray *oldLocations = [[NSMutableArray alloc] initWithArray:aMap.locations];
        [oldLocations addObject:self.address];
        aMap.locations = oldLocations;        
    }
    NSLog(@"%s", __FUNCTION__);
    [dmgr.maps enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj: %@", [obj description]);
    }];
}

0 个答案:

没有答案