0

MKPointAnnotationを使用して、MKMapViewのいくつかの場所にデータを入力しました。注釈をタップすると、UIActionSheetメニューでいくつかのオプションが表示されます。オプションには、ユーザーがUIActionSheetの削除オプションをタップしたときに、マップ上の選択された注釈を削除するいくつかの削除機能があります。問題は、どの注釈ポイントがクリックされたかを判別できないことです。それを参照していないようです。

注釈ポイントを追加するコードは次のとおりです。

while(looping array of locations)
{
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
annotationPoint.coordinate = {coord of my location}
annotationPoint.title = [anObject objectForKey:@"castTitle"];
annotationPoint.subtitle = [anObject objectForKey:@"storeName"];

[self.mainMapView addAnnotation:annotationPoint];
}

注釈をタップしたときにUIActionSheetを表示するコードは次のとおりです。

-(MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    if([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];

    pinView.animatesDrop = YES;
    pinView.canShowCallout = YES;
    pinView.pinColor = [self getAnnotationColor];

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    [rightButton addTarget:self action:@selector(showOptions:) forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

-(IBAction)showOptions:(id)sender
{
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"", @"") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel") destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Delete", @"Delete"),      nil];

        [sheet showInView:[self.view window]];
}
4

2 に答える 2

3

MKPointAnnotation から継承するクラスを作成し、id プロパティを追加して、クラスを使用することもできます。

@interface MyPointAnnotation : MKPointAnnotation 

@property int pointId;

@end

そしてそれをView Controllerで使用します:

注釈を作成:

    MyPointAnnotation *myAnnotation = [[MyPointAnnotation alloc]init];
    myAnnotation.coordinate= someCoordinates;
    [myAnnotation setTitle:@"i am annotation with id"];
    myAnnotation.pointId = 1;
    [self.mapView addAnnotation:myAnnotation];

座標の配列がある場合は、ループして注釈を作成できます。

また、注釈ビューをその ID でカスタマイズすることもできます。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{

MKPinAnnotationView *view=(MKPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"reuseme"];
  if (!view) {
      view=[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"reuseme"];
  }


  if (((MyPointAnnotation *)annotation).pointId == 1)
  {
      //the annotation with id 1.
  }
return view;
}
于 2013-08-03T18:56:04.803 に答える
2

2つのアプローチがあるようです。

一度に1つの注釈しか選択できない場合-selectedAnnotationsは、囲んでいるのプロパティにアクセスできますMKMapView

別のアプローチは、アクションをトリガーしたを参照するで検査senderすることです。を囲んでいることを確認してください。これにより、関連するが表示されます。次に、これをivarとして隠しておくか、(私の好みのアプローチで)ランタイムマジックを使用して(で宣言された形式で) 、アノテーションへの参照をアクションシートに添付して、デリゲートコールバックで簡単に取得できるようにします。 showOptions:UIButtonMKAnnotationView-annotationobjc_setAssociatedObject()<objc/runtime.h>

(必要に応じて、ボタンの作成フェーズで実際にこれを実行し、注釈への参照をUIButtonに添付できます。これはshowOptions:、アクションシートで直接取得して再添付できます。

しかし[MKMapView selectedAnnotations]、それがあなたのニーズに合っていれば、私は行くのがより簡単な方法だと思います。

于 2012-05-10T08:43:55.993 に答える