检测选定的注释以更改引脚颜色

时间:2014-03-17 17:53:24

标签: ios mkmapview mkannotationview

我现在正在研究mapView。这是场景:

  1. 所有注释都来自JSON对象(MySQL表)。
  2. 注释按源表分组:
  3. 表1-> Ofertas,表2-> Cursos,表3-> EVENTOS。
  4. 最初显示的地图区域足够大,以便稍后显示所有注释。
  5. 有一个UISegmentedControll让用户选择应该显示哪个注释组。
  6. 在此应用状态下,我需要进行以下更新:

    1. 每个注释组应具有不同的引脚颜色。
    2. 这是我用来根据所选索引将注释绘制到mapView的方法:

      - (IBAction)changeOpcion:(id)sender{
      
          if(miControl.selectedSegmentIndex == 0)
          {
              //[mapView_ clear];
      
              [self removeAllPinsButUserLocation2];
              NSLog(@"********0");
              for ( int i=0;i<[categorias count];i++){
      
                  int grupo = [[[categorias objectAtIndex:i] objectForKey:@"procedencia"] integerValue];
      
      
      
                  if (grupo == 1){
      
                      double latitud = [[[categorias objectAtIndex:i] objectForKey:@"latitud"] doubleValue];
      
                      double longitud = [[[categorias objectAtIndex:i] objectForKey:@"longitud"]doubleValue];
      
                      CLLocationCoordinate2D lugar;
                      lugar.latitude = latitud;
                      lugar.longitude = longitud;
      
                      NSString *nombre = [[categorias objectAtIndex:i] objectForKey:@"titulo"];
      
      
                      NSString *direccion = [[categorias objectAtIndex:i] objectForKey:@"direccion"];
      
                      CLLocationCoordinate2D coordinate3;
                      coordinate3.latitude = latitud;
                      coordinate3.longitude = longitud;
                      myAnnotation *annotation3 = [[myAnnotation alloc] initWithCoordinate:coordinate3 title:nombre];
                      [self.mapView addAnnotation:annotation3];
      
                  }
              }
          }
          else if(miControl.selectedSegmentIndex == 1)
          {
              [self removeAllPinsButUserLocation2];
      
              for ( int i=0;i<[categorias count];i++){
      
                  int grupo = [[[categorias objectAtIndex:i] objectForKey:@"procedencia"] integerValue];
      
      
      
                  if (grupo == 2){
      
                      double latitud = [[[categorias objectAtIndex:i] objectForKey:@"latitud"] doubleValue];
      
                      double longitud = [[[categorias objectAtIndex:i] objectForKey:@"longitud"]doubleValue];
      
                      CLLocationCoordinate2D lugar;
                      lugar.latitude = latitud;
                      lugar.longitude = longitud;
      
                      NSString *nombre = [[categorias objectAtIndex:i] objectForKey:@"titulo"];
      
      
                      NSString *direccion = [[categorias objectAtIndex:i] objectForKey:@"direccion"];
      
      
                      CLLocationCoordinate2D coordinate3;
                      coordinate3.latitude = latitud;
                      coordinate3.longitude = longitud;
                      myAnnotation *annotation3 = [[myAnnotation alloc] initWithCoordinate:coordinate3 title:nombre];
                      [self.mapView addAnnotation:annotation3];
      
      
                  }
              }
      
              //action for the second button
          }
          else if(miControl.selectedSegmentIndex == 2)
          {
              [self removeAllPinsButUserLocation2];
      
              for ( int i=0;i<[categorias count];i++){
      
                  int grupo = [[[categorias objectAtIndex:i] objectForKey:@"procedencia"] integerValue];
      
      
      
                  if (grupo == 3){
      
                      double latitud = [[[categorias objectAtIndex:i] objectForKey:@"latitud"] doubleValue];
      
                      double longitud = [[[categorias objectAtIndex:i] objectForKey:@"longitud"]doubleValue];
      
                      CLLocationCoordinate2D lugar;
                      lugar.latitude = latitud;
                      lugar.longitude = longitud;
      
                      NSString *nombre = [[categorias objectAtIndex:i] objectForKey:@"titulo"];
      
      
                      NSString *direccion = [[categorias objectAtIndex:i] objectForKey:@"direccion"];
      
      
                      CLLocationCoordinate2D coordinate3;
                      coordinate3.latitude = latitud;
                      coordinate3.longitude = longitud;
                      myAnnotation *annotation3 = [[myAnnotation alloc] initWithCoordinate:coordinate3 title:nombre];
                      [self.mapView addAnnotation:annotation3];
      
      
                  }
              }
          }
      
      
      }
      

      这是我的viewForAnnotation方法的代码:

      - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation {
      
          if([annotation isKindOfClass:[MKUserLocation class]])
              return nil;
      
      
          static NSString *identifier = @"myAnnotation";
          MKPinAnnotationView * annotationView = (MKPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
          if (!annotationView)
          {
      
              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;
      }
      

      我的第一个问题是:如何更新viewForAnnotation方法以检测所选注释的组以更改引脚颜色。

1 个答案:

答案 0 :(得分:1)

由于您一次只显示一组(一种颜色)的注释,因此最简单,最直接(但 - 不推荐)的方法是:

viewForAnnotation中,根据pinColor的当前值设置miControl.selectedSegmentIndex

只有在一次显示一组注释并且它将分段控件(某些外部UI元素)的值与地图委托方法联系起来时,这才会正常工作。将来,您可能希望一次显示多个组,或者您可能想要更改控制显示哪些组的UI,现在您必须更改viewForAnnotation中的代码等。


请注意,在viewForAnnotation委托方法中,它会传递对地图想要查看的注释对象的引用(annotation参数)。

如果注释对象本身知道它属于哪个组,那么您可以根据pinColor的某些属性在viewForAnnotation中设置annotation

因此,推荐的方法是将注释对象本身所需的数据添加到myAnnotation类中。您可以向其添加grupo属性,在创建每个注释时设置此属性,然后在viewForAnnotation中进行检查以设置pinColor。例如:

  • myAnnotation.h

    @property (nonatomic, assign) int grupo;
    
  • 在添加注释的changeOpcion:方法中:

    myAnnotation *annotation3 = [[myAnnotation alloc] initWith...
    annotation3.grupo = grupo;  // <-- tell the annotation what group it's in
    [self.mapView addAnnotation:annotation3];
    
  • 最后,在viewForAnnotation中,在返回视图之前,根据pinColor设置grupo

    if ([annotation isKindOfClass:[myAnnotation class]])
    {
        myAnnotation *myAnn = (myAnnotation *)annotation;
        switch (myAnn.grupo)
        {
            case 1:
                annotationView.pinColor = MKPinAnnotationColorGreen;
                break;
            case 2:
                annotationView.pinColor = MKPinAnnotationColorPurple;
                break;
            default:
                annotationView.pinColor = MKPinAnnotationColorRed;
                break;
        }
    }
    
    return annotationView;
    

这样,您可以一次显示多个或所有组(颜色),viewForAnnotation不依赖于外部用户界面。


<小时/> 只是评论与您的​​问题或问题无关的代码:
changeOpcion:方法中,在循环注释中存在不必要的代码重复。三个块之间的唯一区别是它正在检查的grupo的值(if (grupo == 1)if (grupo == 2)if (grupo == 3))。

另一种方法是创建一个方法,将grupo作为参数,然后从changeOpcion:调用该方法。例如:

- (void)addAnnotationsForGroup:(int)selectedGrupo
{
    [self removeAllPinsButUserLocation2];
    NSLog(@"********0");

    for (int i=0; i < [categorias count]; i++) 
    {    
        int grupo = [[[categorias objectAtIndex:i] objectForKey:@"procedencia"] integerValue];

        if (grupo == selectedGrupo)
        {
            //code to create annotation here
        }
    }
}

- (IBAction)changeOpcion:(id)sender
{
    switch (miControl.selectedSegmentIndex) 
    {
        case 0:
            [self addAnnotationsForGroup:1];
            break;
        case 1:
            [self addAnnotationsForGroup:2];
            break;
        case 2:
            [self addAnnotationsForGroup:3];
            break;
        default:
            break;
    }
}