0

私はMapViewを使用していて、30のピン位置が配置されており、すべてがうまく機能しています。rightCalloutAccessoryViewを使用してコールアウトにボタンを追加しました。ボタンコードは次のとおりです。

UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    pinView.rightCalloutAccessoryView = rightButton;
    [rightButton addTarget:self action:@selector(rightButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    return pinView;
}

これは正常に機能し、「rightButtonPressed」メソッドを呼び出します。そのメソッドの実装は次のとおりです。

-(IBAction) rightButtonPressed:(id)sender
{
    NSLog(@"button clicked");
    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
    [thisMap switchViews:self.view toView:dvc.view];
}

したがって、ご覧のとおり、30ピンのコールアウトすべてのボタンに触れると、同じビュー(DetailViewController)に移動します。各ボタンに独自のビューを切り替えてもらいたい(ここに「DirectionsToHere」や「DirectionsFromHere」などと店舗の住所と名前を配置します)。

30個のビューを作成し、各ピンに適用できる30個の異なるメソッドを作成できることはわかっていますが、配列を処理するより簡潔なコードが必要であることはわかっています。

可能性のある特定の配列は、DetailViewControllerのUILabelで呼び出される可能性があるため、適切な情報をロードするだけでなく、適切な場所への道順も示します。

これは大きな質問かもしれません。私はいくつかのチュートリアルを探しましたが、質問に正確に答えるものは見つかりませんでした。誰かが私を始めることができれば(または私を正しい方向に向けることさえできれば)、私は完全に感謝するでしょう。

4

1 に答える 1

1

アノテーションビューのコールアウトアクセサリでは、独自のカスタムメソッドcalloutAccessoryControlTappedを使用する代わりに、マップビュー独自のデリゲートメソッドを使用してボタンの押下を処理する方がはるかに優れています。addTarget

デリゲートメソッドでは、配列内のどのアノテーションやタップされたデータ構造を把握しなくても、をcalloutAccessoryControlTapped使用してタップされたアノテーションに直接アクセスできます。view.annotation

の呼び出しを削除し、メソッドを次のようaddTargetに置き換えます。rightButtonPressed:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
            calloutAccessoryControlTapped:(UIControl *)control
{
    //cast the plain view.annotation to your custom class so you can
    //easily access your custom annotation class' properties...
    YourAnnotationClass *annotationTapped = (YourAnnotationClass *)view.annotation;

    NSLog(@"button clicked on annotation %@", annotationTapped);

    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];

    //annotationTapped can be passed to the DetailViewController
    //or just the properties needed can be passed...
    //Example line below assumes you add a annotation property to DetailViewController.
    dvc.annotation = annotationTapped;

    [thisMap switchViews:self.view toView:dvc.view];
}
于 2011-10-14T17:03:03.927 に答える