1

我有一张地图,上面有 3 种标准颜色的别针。这些引脚根据解析并存储到数组中的 xml 中的值进行着色。

我想添加一个带有 2 个按钮的分段控件:

按钮 1 仅显示绿色引脚。

和按钮 2 仅显示红色和紫色引脚。

我已阅读有关为每种引脚颜色添加 3 个不同的阵列并删除引脚阵列的信息,但我想保留一个阵列。如果可能的话,我将如何做到这一点。我知道如何实现分段控件,但我不知道如何打开或关闭它们。

这是我的 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通过过滤器的那些。

这可能会导致一些闪烁,因为注释被删除并再次添加,但相对容易实现。


另一种选择是执行以下操作(最初和过滤器更改后)。循环locationArray和:

  • 如果该项目通过过滤器并且尚未在地图的annotations数组中,则将其添加到地图中
  • 如果该项目未通过过滤器并且地图的annotations数组中,则将其从地图中删除

但是,此方法要求您的注释对象中有一些唯一属性,可用于实现“已在地图中”存在检查(不建议使用坐标)。您可能需要将该唯一属性添加到MyAnnotation类中。

或者,如果您保留自己的所有可能MyAnnotation对象的主数组,您可以简单地使用containsObject它来测试它是否在地图的annotations数组中。

于 2012-12-03T03:47:50.660 回答