2012-02-03 12 views
2

現在のユーザーの場所のコールアウトに右のアクセサリボタンを追加したいとします。私はトピックについていくつかの質問を見つけましたが、私にとってはうまくいかないようです。ここで私はこれまでのところ、私は成功した私の他の注釈に右補ボタンを入れているコードは次のとおりです。現在のロケーションコールアウトに適切なアクセサリボタンを配置するにはどうすればよいですか?

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
     //TODO: this doesn't seem to be working? 
    if ([annotation isKindOfClass:[MKUserLocation class]]) { 
     MKAnnotationView * aV = [mapView viewForAnnotation:annotation]; 
     aV.canShowCallout = YES; 
     aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     return nil; 
    } 
    return nil; 
} 

私は解決策は、ユーザーの場所のカスタムMKAnnotationViewを作ることであるいくつかの場所で読みました私はこれがユーザーの場所でどのように行われたかのデモンストレーションを見たことがありません - 私はマップ上の他の注釈に対してもこれを成功させました。

サンプルコードが最も役に立ちます。ありがとうございます!

答えて

9

再度、ユーザーの場所の注釈ビューの参照を取得する必要があります。 以下の方法がiOSの> = 5

オプション1

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    MKAnnotationView *aV; 
    for (aV in views) { 
      if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { 
       MKAnnotationView* annotationView = aV; 
       annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      } 
    } 
} 

代替方法

だけでなく、以下のデリゲートメソッドを参照してください
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation]; 
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
} 

に呼び出されるのを確認してくださいデリゲートメソッドを追加して、いつでも何でもできます。コールアウトボタンがタップされています。これらのいずれかの方法のいずれかのiOSで

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

が呼び出されると、あなたはそれを左/右accessorybuttonを追加することができます。ユーザーの場所の注釈ビューのサブビュー数を確認してこのボタンを2回追加しないようにしてください。

ます。また、実行時にそれaccessoryviews追加/削除することができますが、私はあなたが非常に有望に見えるit.buttons

+0

@chaturさん、ありがとうございました! Btw、iOS 4.xとiOS 5の両方のバージョンをどのようにサポートしますか? –

1

あなたの主な問題は、どちらの場合もnilを返すことです。再利用識別子も使用する必要があります。

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

if ([annotation isKindOfClass:[MKUserLocation class]]) { 
    MKAnnotationView * aV = [mapView dequeueReusableAnnotationViewWithIdentifier:@"locationView"]; 
    if (aV == nil) 
     aV = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationView"]; 
    aV.canShowCallout = YES; 
    aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    return aV; 
    } 
return nil; 
} 

また、実装する必要があります:コールアウト付属品の行動のための

- (void)mapView:(MKMapView *)_mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

+0

を削除するとは思わないだろうと信じて、私はそれを試してみると、それに応じて投票します! –

+0

これはあなたのために機能しましたか?私は私のアプリケーションの1つにほとんど同じコードを持っていて、問題はなかった。 – brendan

+0

恐れていない!私は現在、地図上にユーザーの位置マーカーは表示されていません。私がそれを元に戻すように戻すように変更すると、以前のように動作しますが、アクセサリボタンは表示されません。提案? –