据我了解,当您执行以下操作时:
[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
当我 NSLog _locations 时,我看到两个对象。我认为它会在调用委托后向地图添加两个引脚,并将为数组中的每个对象添加一个引脚到屏幕上。但是,当我在委托 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]);
}];
}