2011-10-27 46 views
1

我創建了一個MKAnnotationView,並在其上添加了一個UIButton。現在我想的是按鈕,刪除該引腳是在iOS-獲取MKAnnotationView上的按鈕以刪除PIN碼

這是我如何添加按鈕:

- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *pinAnnotation = nil; 
    if(annotation != myMapView.userLocation) 
    { 
     NSString *defaultPinID = [[NSString alloc] initWithFormat:@"pin%d",pinCount]; 
     pinAnnotation = (MKPinAnnotationView *)[myMapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinAnnotation == nil) 
      pinAnnotation = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease]; 
     pinAnnotation.canShowCallout = YES; 

    //// ADDING MY BUTTON 
     UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     pinAnnotation.rightCalloutAccessoryView = deleteButton; 
    //// ADDING IT'S ACTION 
     [deleteButton addTarget:self action:@selector(deletePin) forControlEvents:UIControlEventTouchUpInside]; 
    } 
    pinCount++; 
    return pinAnnotation; 
} 

正如你可以看到那裏,我設置的動作來調用這個方法:

-(void)deletePin 
{ 
    //What to put here...? 
} 

我該怎麼做才能刪除它的按鈕的引腳?

我想可能發送id通過什麼,但我不知道如何。

回答

4

隨着註釋標註附件的意見,不要使用你自己的目標/行動方法。

而是使用地圖視圖的calloutAccessoryControlTapped委託方法,這將使這項工作更容易。

刪除addTarget行和您的自定義方法。然後實現委託方法來代替:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
      calloutAccessoryControlTapped:(UIControl *)control 
{ 
    [mapView removeAnnotation:view.annotation]; 
} 


此外,不相關的,但你要設置的再利用標識的方式是錯誤和失敗重用性通過分配不同的ID對每個註釋。推薦以下內容:

- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *pinAnnotationView = nil; 
    if (annotation != myMapView.userLocation) 
    { 
     NSString *reuseId = @"StandardPin"; 
     pinAnnotationView = (MKPinAnnotationView *)[myMapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; 
     if (pinAnnotationView == nil) 
     { 
      pinAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId] autorelease]; 
      pinAnnotationView.canShowCallout = YES; 

      UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      pinAnnotationView.rightCalloutAccessoryView = deleteButton; 
     } 
     else 
      //update annotation property if view is being re-used... 
      pinAnnotationView.annotation = annotation; 
    } 

    return pinAnnotationView; 
} 
+0

很酷!感謝並感謝所添加的部分。 – LouwHopley

+0

如何從另一個viewController中刪除? – Camus

+0

@Camus:請提出一個新問題,提供您已經嘗試過的詳細信息和代碼。 – Anna

1

獲取發件人在回調

[deleteButton addTarget:self action:@selector(deletePin:) forControlEvents:UIControlEventTouchUpInside]; 

-(void)deletePin:(id)sender 
{ 
    //What to put here...? 
} 

然後獲得與MKPinAnnotationView相關的MKAnnotation,從的MKMapView的註釋中取出,並重繪([mapView setNeedsDisplay]