更新MKMapkit视图注释不起作用?

时间:2013-12-14 07:15:17

标签: ios annotations nsarray mkmapview mapkit

我有一个带有MKMapKit和PickerView.Like的UIViewcontroller,如下图所示。 UIViewcontroller 我有一个plist,其中包含与PickerView中的值对应的所有坐标。因此,一旦我从PickerView中选择任何项目,我将刷新当前地图并获取新项目的坐标(有时可能是5到6个坐标)并在地图中显示。

但对我来说,我可以看到“注释”即将来到地图视图,但是当我点击另一个项目时,之前的引脚仍然在地图中。

我想只显示所选PickerView项目的注释引脚。请帮助我

使用案例: 这是我的plist文件 enter image description here

在我的plist中有一个名为“categories”的字段Pickerview中列出的项目是总类别列表。

因此,当我滚动浏览PickerView时,我将检查所选项目是否与Plist类别字段中的任何项目匹配。如果匹配的iam在地图视图中显示其坐标。

但是当我点击PickerView中的“restuarents”类别时,我得到了以下正确的地图。

enter image description here

当我点击“cluburi”类别时,它应该在地图中显示2个Pins而不是3.实际上它不会从地图中清除当前的“restuarent”Pin。如下图enter image description here

那么在显示新Pins之前如何清除地图中的先前Pins?

这是我在viewcontroller.m文件中的代码

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return [locations count];
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [locations objectAtIndex: row];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

[_MAPVIEW setRegion:[_MAPVIEW region] animated:YES];

    for(int j=0;j<[[savedContentsarray valueForKey:@"category"] count];j++)
    {
        if([[[savedContentsarray valueForKey:@"category"] objectAtIndex:j] isEqualToString:[locations objectAtIndex: row]])
         {


              coordinate.latitude=[[latitude objectAtIndex:j] floatValue];
              coordinate.longitude=[[longitude objectAtIndex:j] floatValue];
              annotation = [[myAnnotation alloc] initWithCoordinate:coordinate title:[[savedContentsarray valueForKey:@"name"]objectAtIndex:j]];
              [_MAPVIEW addAnnotation:annotation];


        }

    }

}

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

    //8
    static NSString *identifier = @"myAnnotation";
    MKPinAnnotationView * annotationView = (MKPinAnnotationView*)[_MAPVIEW dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (!annotationView)
    {
        //9
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        annotationView.pinColor = MKPinAnnotationColorPurple;
        annotationView.animatesDrop = YES;
        annotationView.canShowCallout = YES;
    }else {
        annotationView.annotation = annotation;
    }
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    return annotationView;
}

1 个答案:

答案 0 :(得分:1)

因此,在我的应用中,我创建了一个自定义类,继承自MKAnnotationView btMapAnnotation。您必须在选择器控件中选择任何对象时进行此调用。

for (NSObject *a in [mapView annotations]) {
    if ([a isKindOfClass:[btMapAnnotation class]]) {
        btMapAnnotation *annotation = (btMapAnnotation *)a;
        [mapView removeAnnotation:annotation];
    }
}

完成此调用后,只需将新注释添加到地图中。