1

3つの標準色のピンがロードされたマップがあります。これらのピンは、解析されて配列に格納されるxmlの値に基づいて色付けされます。

2つのボタンを持つセグメント化されたコントロールを追加したいと思います。

ボタン1は、緑色のピンのみを表示します。

ボタン2は、赤と紫のピンのみを表示します。

ピンの色ごとに3つの異なる配列を追加し、ピンの配列を削除する方法について読みましたが、1つの配列を維持したいと思います。可能であれば、これをどのように行いますか。セグメント化されたコントロールを実装する方法は知っていますが、それらをオンまたはオフにフィルタリングする方法に困惑しました。

これが私のforループです。これにより、ピンが作成され、正常に機能する3つの色が割り当てられます。

//Count the array of annotations and add them dynamically to the map.
for (int i = 0; i < locationArray.count; i++) {
    myAnnotation =[[MyAnnotation alloc] init];

    NSString *latString = [[locationArray objectAtIndex:i]xmlLat];
    NSString *lonString = [[locationArray objectAtIndex:i]xmlLon];

    type = [[locationArray objectAtIndex:i]xmlType];
    imageId = [[locationArray objectAtIndex:i]xmlImageId];
    address = [[locationArray objectAtIndex:i]xmlAddress];
    email = [[locationArray objectAtIndex:i]xmlEmail];
    phone = [[locationArray objectAtIndex:i]xmlPhone];
    live = [[locationArray objectAtIndex:i]xmlLive];
    form = [[locationArray objectAtIndex:i]xmlForm];
    name = [[locationArray objectAtIndex:i]xmlName];

    //Change the 0 to Active ticket and 1 to Closed 2 to False and 3 to Not Found and 4 to Other
    if ([live isEqualToString:@"0"]) {
        live = @"Active";
    }

    else if ([live isEqualToString:@"1"]){
        live = @"Closed";
    }

    else if([live isEqualToString:@"2"]){
        live = @"False";

    }

    else if ([live isEqualToString:@"3"]){
        live = @"Not Found";

    }

    else if ([live isEqualToString:@"4"]){
        live = @"Other";
    }


    double theLatitude = [latString doubleValue];
    double theLongtitude = [lonString doubleValue];

    userLocation.latitude=theLatitude;
    userLocation.longitude=theLongtitude;

    myAnnotation.coordinate=userLocation;
    myAnnotation.title=[NSString stringWithFormat:@"%@", imageId];
    myAnnotation.subtitle=[NSString stringWithFormat:@"%@", type];


    //Setting pin colours here based on value from XML
    if ([live isEqualToString:@"Active"]){
        myAnnotation.pinColor = MKPinAnnotationColorGreen;
    }else if ([live isEqualToString:@"Closed"]){
        myAnnotation.pinColor = MKPinAnnotationColorRed;
    }
    else if ([live isEqualToString:@"Not Found"]){
        myAnnotation.pinColor = MKPinAnnotationColorPurple;
    }
        [incidentsMap addAnnotation:myAnnotation];

    }

そしてここに私のセグメント化されたコントロールがあります

-(IBAction)segmentedControl:(id)sender{

if (mapFilter.selectedSegmentIndex == 0) {
    NSLog(@"Active");
}

else if (mapFilter.selectedSegmentIndex == 1){
    NSLog(@"Closed");

//Remove Red and Purple Pins here from view when segmented control button button is    touched.........................

        }
else if (mapFilter.selectedSegmentIndex == 2){

    UIAlertView *mapSelector = [[UIAlertView alloc]initWithTitle:@"Select Map Type" message:@"Choose from 3 map views" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Default", @"Hybrid", @"Satelite", nil];
    [mapSelector show];

    }

}

4

1 に答える 1

0

最も単純なアプローチは、最初とフィルター基準が変更されるたびに(たとえば、セグメント化されたコントロールの値が変更されたとき):

  1. マップからすべての注釈を削除します。使用しますremoveAnnotations(またはremoveAnnotationいくつかのループで)。
  2. フィルタ基準に合格したものだけを追加します。をループして、フィルターを通過するものlocationArrayだけを呼び出します。addAnnotation

これにより、注釈が削除されて再度追加されるときにちらつきが発生する可能性がありますが、実装は比較的簡単です。


もう1つの方法は、次のことを行うことです(最初とフィルターの変更後の両方)。locationArrayおよびをループします。

  • アイテムがフィルター通過し、マップの配列にまだ含まれていないannotations場合は、アイテムをマップに追加します
  • アイテムがフィルターを通過せず、マップの配列にある場合は、マップからアイテムを削除しますannotations

ただし、この方法では、注釈オブジェクトに「すでにマップにある」存在チェックを実装するために使用できる一意のプロパティが必要です(座標を使用することはお勧めしません)。MyAnnotationその一意のプロパティをクラス に追加する必要がある場合があります。

または、すべての可能なMyAnnotationオブジェクトの独自のマスター配列を保持しているcontainsObject場合は、それがマップのannotations配列にあるかどうかをテストするために使用できます。

于 2012-12-03T03:47:50.660 に答える