マップからピンを削除しようとしています。MKPinAnnotationViewの@"selected"プロパティにオブザーバーがあるので、削除するオブジェクトがわかります。ユーザーがゴミ箱アイコンをタップしてピンを選択すると、次のメソッドが呼び出されます。
- (IBAction)deleteAnnotationView:(id)sender {
MKPinAnnotationView *pinView = (MKPinAnnotationView *)[self.mapView viewForAnnotation:self.currentAddress];
[pinView removeObserver:self forKeyPath:@"selected"];
[self.mapView removeAnnotation:self.currentAddress];
[self.map removeLocationsObject:self.currentAddress];
}
ピンをどこにもドラッグしない場合、この方法は正常に機能します。ピンをドラッグすると、上記のメソッドのpinViewはnilを返し、MKPinAnnotationViewがMKMapViewから削除されることはありません。理由はわかりません。これがdidChangeDragStateデリゲートメソッドです。
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {
if (newState == MKAnnotationViewDragStateEnding) {
CLLocationCoordinate2D draggedCoordinate = view.annotation.coordinate;
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:draggedCoordinate.latitude longitude:draggedCoordinate.longitude];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
// Check for returned placemarks
if (placemarks && [placemarks count] > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];
AddressAnnotation *anAddress = [AddressAnnotation annotationWithPlacemark:topResult inContext:self.managedObjectContext];
view.annotation = anAddress;
self.currentAddress = anAddress;
}
}];
}
}
didChangeDragState:メソッドとdeleteAnnotationView:メソッドの両方で、self.addressオブジェクトに有効なアドレスがあります。ただし、何らかの理由で、ピンをドラッグすると、pinViewはnilになります。何かご意見は?ありがとう!