MapKit更新注释图像

Rob*_*rto 2 cocoa-touch mapkit mkannotation mkannotationview ios4

我在找到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;    
}
Run Code Online (Sandbox Code Playgroud)

稍后,我做了一个请求,结果是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;
}
Run Code Online (Sandbox Code Playgroud)

这不会带来任何错误(假设我正确地粘贴并转换了所有内容),但NSMutableDictionary应包含我的自定义MKAnnotationView和MKAnnotation,但即使我在请求完成之前记录它们并且它正确显示,当请求完成时好像MKAnnotationView和MKAnnotation都不是我所期望的,因此,我无法修改注释来更改图像或更新注释视图.

任何想法,将不胜感激!

小智 6

我不确定你为什么从标记数组中获取nil值(特别是对于注释).但是,我不建议像这样存储对注释视图的引用.

viewForAnnotation委托方法可以通过地图被调用查看它认为这是必要的,视图对象可能会改变从一个调用到下一个任何时候.由于您还使用相同的重复使用标识符为每个注释重新使用注释视图,因此稍后可能会将相同的视图对象重新用于另一个注释.

相反,updateStation我建议如下:

  • 循环遍历地图视图的annotations数组
  • 如果注释是类型EstacionEB,则检查它是否eid与正在更新的注释匹配
  • 更新注释subTitleelStatus属性(更新elStatus是很重要的,因为viewForAnnotation委托方法使用它来设置图像)
  • 通过调用地图视图的获得注释的当前视图viewForAnnotation:实例方法(这是一样的委托方法mapView:viewForAnnotation:)
  • 更新image视图的属性

有关类似示例,请参阅此其他相关问题.