0

mapView の注釈に関して問題があります。私の要件を一目見てみましょう。

ユーザーが会議の場所を選択できるようにしたい。

2 つのオプションがあります。

1)近くのデータのリストを提供する必要があります

または

2) 好きな場所にピンをドラッグ アンド ドロップできます。

そのために、1 つのセグメントを作成しました。近くのデータの最初のインデックスと、ピンをドロップするための 2 番目のインデックス。

最初のオプション(「近く」 )の場合、売り手の場所、買い手の場所、売り手と買い手の中間点から近くのデータを取得する必要があります。そこでGoogle apiを呼び出し、緯度と経度を3回渡してデータを取得します。初めてデータを取得するときは問題ありません。私の配列はすべてのデータ (3 つの応答を含む) でいっぱいになり、ピンの色も要件に応じて変化します。

買い手 (赤) 売り手 (紫) 中間点 (緑)

ドロップ ピンをクリックすると、すべてのデータが配列から削除され、1 つのピンがマップ上にドロップされます。

今まではうまくいきました!

しかし、もう一度「近く」をクリックすると、問題が発生します。間違いなく、必要なデータが得られますが、ピンの色は維持されません。

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

    if ([segmentND selectedSegmentIndex]==0) {

        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;

       static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
        MKPinAnnotationView* pinView = (MKPinAnnotationView *)
        [myMapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
        if (!pinView)
        {
            MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
                                                   initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];

            switch (self.pinColor) {
                case 0:
                {
                    customPinView.pinColor = MKPinAnnotationColorPurple;
                }
                    break;
                case 1:
                {
                    customPinView.pinColor = MKPinAnnotationColorRed;
                }
                    break;
                case 2:
                {
                    customPinView.pinColor = MKPinAnnotationColorGreen;
                }
                    break;
                default:
                    break;
            }
            customPinView.canShowCallout = YES;

            UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];


            [rightButton addTarget:self
                            action:@selector(showDetails:)
                  forControlEvents:UIControlEventTouchUpInside];
            customPinView.rightCalloutAccessoryView = rightButton;

            return customPinView;
        }
        else
        {
            pinView.annotation = annotation;
        }
        return pinView;
    }
    else {

        // Code of dragging dropping pin. It works Fine.s
    }
}

もっとアイデアを得るために画像を添付しています。

解決策またはそれを実装する別の方法を教えてください。ピンの色は、売り手と買い手を区別するために必須です。

4

4 に答える 4

1

現在のアプローチの問題は、マップがビューを必要としている注釈に応じて self.pinColor が変更されないことです。必要に応じていつでも viewForAnnotation を呼び出すことができます。マップがスクロールされて、1 つのピンが表示された可能性があります。おそらく、アプリはバックグラウンドに置かれ、ユーザーによって表示されているだけです。注釈を分析する必要がある理由は何であれ、ビューで使用するピンの色を決定するために渡すことです。注釈に使用しているオブジェクトは何ですか? それが HSAno で、pinColor というプロパティがあった場合、switch ステートメントの代わりに次のようにします。

HSAnno* currentAnno = (HSAnno *)annotation;
pinView.pinColor = currentAnno.pinColor;

そうすれば、どの注釈を再描画する必要があっても、viewForAnnotation は常に適切な色のピンを返します。

于 2012-08-31T20:15:13.923 に答える
0

再利用可能なピンが存在しない場合は、そのコード部分にピンカラーを設定します。

if (!pinView)
    ....
    customPinView.pinColor = MKPinAnnotationColorPurple;
    ....
}

viewForAnnotationが呼び出され、再利用可能なピンが見つかった場合、それらが使用されます。間違ったカラーピンが取られるところがあります。

ピンカラーを

else
{
    pinView.annotation = annotation;
}

一部とそれはうまくいくはずです。

于 2012-08-31T07:42:37.180 に答える
0

ここで間違っていると思います

    else
    {
        pinView.annotation = annotation;
    }
    return pinView;

に修正します

    else
    {
        pinView.annotation = annotation;        
        return pinView;
    }
于 2012-08-31T07:50:32.457 に答える
0

MKMapViewこれは、コードとデリゲートを少し変更したものです。以前は、pin内部の色を変更して、初回の読み込みif時に 1 回だけ呼び出すようにしていました。MKMapView

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

    static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [mapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
    if (!pinView)
    {
        pinView = [[[MKPinAnnotationView alloc]
                                            initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
    }
    else
    {
        pinView.annotation = annotation;
    }

    switch (self.pinColor) {
        case 0:
        {
            pinView.pinColor = MKPinAnnotationColorPurple;

        }
            break;
        case 1:
        {
            pinView.pinColor = MKPinAnnotationColorRed;
        }
            break;
        case 2:
        {
            pinView.pinColor = MKPinAnnotationColorGreen;
        }
            break;
        default:
            break;

    pinView.canShowCallout = YES;

    UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];


    [rightButton addTarget:self
                    action:@selector(showDetails:)
          forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

    return pinView;
}

PS私はあなたの最初のUISegment条件を私の側でチェックするために削除しました。実装するときにそのまま追加してください。

于 2012-08-31T07:54:32.317 に答える