我现在正在研究mapView。这是场景:
在此应用状态下,我需要进行以下更新:
这是我用来根据所选索引将注释绘制到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方法以检测所选注释的组以更改引脚颜色。
答案 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;
}
}