我在查找异步请求完成后更新自定义MKAnnotationView
图像的方法时遇到问题,并提供有关注释状态的信息。到目前为止,我有这个:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *identifier = @"EstacionEB";
if ([annotation isKindOfClass:[EstacionEB class]]) {
EstacionEB *location = (EstacionEB *) annotation;
CustomPin *annotationView = (CustomPin *) [_mapita dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil) {
annotationView = [[CustomPin alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
} else {
annotationView.annotation = annotation;
}
UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", [location elStatus]]];
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
annotationView.image = image;
NSDictionary *temp = [[NSDictionary alloc]
initWithObjects:[NSArray arrayWithObjects:annotationView, location, nil]
forKeys:[NSArray arrayWithObjects:@"view", @"annotation", nil]
];
//This array is synthesized and inited in my controller's viewDidLoad
[self.markers setObject:temp forKey:location.eid];
return annotationView;
}
return nil;
}
稍后,我做了一个请求,结果是一个NSDictionary,我正在尝试执行以下操作,它会向两个元素返回null:
- (void)updateStation:(NSString *)eid withDetails:(NSDictionary *)details
{
NSInteger free = [details objectForKey:@"free"];
NSInteger parkings = [details objectForKey:@"parkings"];
NSDictionary *storedStations = [self.markers objectForKey:eid];
CustomPin *pin = [storedStations objectForKey:@"view"]; //nil
EstacionEB *station = [referencia objectForKey:@"annotation"]; //nil as well
[station setSubtitle:free];
NSString *status;
if( free==0 ){
status = @"empty";
} else if( (free.intValue>0) && (parkings.intValue<=3) ){
status = @"warning";
} else {
status = @"available";
}
UIImage * image = [UIImage imageNamed:[NSString imageWithFormat:@"%@.png", status]];
pin.image = image;
}
这不会带来任何错误(假设我正确地粘贴并转录了所有内容),但NSMutableDictionary应该包含我的自定义MKAnnotationView和MKAnnotation,但即使我在请求完成之前记录它们并且它正确显示,请求完成它,好像MKAnnotationView和MKAnnotation都不是我所期望的,因此,我无法修改注释来更改图像或更新注释视图。
任何想法都将不胜感激!
答案 0 :(得分:6)
我不确定你为什么从标记数组中获取nil值(特别是对于注释)。但是,我不建议像这样存储对注释视图的引用。
viewForAnnotation
委托方法可以在它认为必要时由地图视图调用,并且视图对象可以从一个调用更改为下一个调用。由于您还使用相同的重复使用标识符为每个注释重新使用注释视图,因此稍后可能会将相同的视图对象重新用于另一个注释。
相反,在updateStation
中,我建议如下:
annotations
数组EstacionEB
,请检查其eid
是否与正在更新的注释相匹配subTitle
和elStatus
属性(更新elStatus
非常重要,因为viewForAnnotation
委托方法使用它来设置图像)viewForAnnotation:
实例方法获取注释的当前视图( 不 与委托方法mapView:viewForAnnotation:
相同) image
属性有关类似示例,请参阅此other related question。