2

我不知道我做错了什么,但它就是行不通。

我的mapView: viewForAnnotation:样子是这样的:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"ImageMapView"];
    if (!aView)
    {
        aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ImageMapView"];
        aView.canShowCallout = YES;
        aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        aView.leftCalloutAccessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    }
    [(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];
    aView.annotation = annotation;
    return aView;
}

因此,每个新注释都以左侧标注中的空白图像视图开始。

现在,当触摸标注时,将执行下一个代码:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    //loading an image
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image];
}

在日志记录的帮助下,我知道图像的 url 和数据都可以,图像本身不是零,但左侧标注中没有显示任何内容。

谁能建议我如何追查这个问题的根源?

编辑

我添加了一些日志,所以我可以看到发生了什么:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    UIImage *image = [self.delegate imagesMapViewController:self thumbnailForAnnotation:view.annotation];
    NSLog(@"Image was: %@", [(UIImageView *)view.leftCalloutAccessoryView image]);
    NSLog(@"Image received: %@", image);
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image];
    NSLog(@"Image became: %@", [(UIImageView *)view.leftCalloutAccessoryView image]);
}

我最终得到下一个输出:

Image was: (null)
Image received: <UIImage: 0x7933470>
Image became: <UIImage: 0x7933470>

所以图像正在设置,但没有出现,我不知道为什么。此外,第一个日志记录信息仅在录制第二个注释视图后才出现,因此第一个注释视图没有调用是很不寻常的mapView: didDeselectAnnotationView:

当我把

[(UIImageView *)aView.leftCalloutAccessoryView setImage:[self.delegate imagesMapViewController:self thumbnailForAnnotation:aView.annotation]];

代替

[(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];

mapView: viewForAnnotation:所有左侧标注配件中都有应有的图像,但想根据需要下载图像

4

4 回答 4

5

问题是,你使用

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view

什么时候应该使用

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

欢呼)

于 2012-05-05T09:08:13.603 回答
2

如果您从变量加载图像,我认为您的 didSelectAnnotationView 方法将不起作用。如果是这样,您需要参考原始注释:

-(void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    MyAnnotation *pin = (MyAnnotation *) [view annotation];
    view.leftCalloutAccessoryView =  [[UIImageView alloc] initWithImage:[UIImage imageNamed:pin.flag]];

}

希望这可以增强原始答案... :)

于 2013-01-12T06:27:46.887 回答
1

在我的,我有一个从 MapViewController 到 UIImageView 的推送 segue,其中 Identifier 设置为 Push segue。

我在 .h 的 MapViewController 中有这个协议:

    @protocol MapViewControllerDelegate <NSObject>
    -(void)mapViewController:(MapViewController *)sender imageForAnnotation:(MKAnnotationView *)annotation;
    -(void)mapViewController:(MapViewController *)sender annotationSegue:(id <MKAnnotation>)annotation;
    @end

然后我在 MapViewController.h @interface 中定义委托:

    @property (nonatomic, weak) id <MapViewControllerDelegate> delegate;

您可能不需要上述所需的协议方法。我不确定。

我看到您的 viewforAnnotation 和我的区别在于我翻转了两行:

    aView.annotation = annotation;
    [(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];

使用此方法后,您会看到地图并选择图钉。然后它转到 didSelectAnnotioatnView,正如我在上面与代表一起展示的那样。

我也有一个具有此方法的 PhotoListTableViewController:

    -(void)mapViewController:(MapViewController *)sender imageForAnnotation:(MKAnnoatioatnView *)annotation
    {
        dispatch_queue_t downloadQueue = dispatch_queue_create ("flickrUrls", NULL);
        dispatch_asynch(downloadQueue, ^{
            FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *) annotation.annotation;
            NSURL *url = [FlickrFetcher urlForPhoto:fpa.phot format:FlickrPhotoFormatSquare];
            NSData *data = [NSData dataWithContentsOfURL:url];
            dispatch_async(dispatch_get_main_queue(), ^{
                UIImage *image = [UIImage imageWithData:data];
                [(UIImageView *)annotation.leftCalloutAccessoryView setImage:image];
            });
        });
        dispatch_release(downloadQueue);
    }

所以我相信这显示了根本原因(上图)。所以你可以看到,上面设置了图像。您使用的方法将其初始化为 nil 以开始。另外,我的 PhotoListTableViewController 在您看到的@interface 的 .m 部分中实现了上述方法

    @interface PhotoListTableViewController()<MapViewControllerDelegate>
于 2012-05-04T23:42:51.947 回答
0

我只是这样做了:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

    if([view.annotation isKindOfClass:[MyLocation class]]) {

        __weak MKAnnotationView *weakView = view;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            NSData *data = [NSData dataWithContentsOfURL:((MyLocation*)weakView.annotation).thumbnailUrl];
            UIImage *image = [UIImage imageWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^ {

                UIImageView *imgView = [[UIImageView alloc] initWithImage:image];
                weakView.leftCalloutAccessoryView = imgView;
            });
        });
    }
}

这意味着它只是在您下载它时开始下载它,当它完成时,它会为视图设置动画以为图像腾出空间。

于 2015-02-19T03:50:16.300 回答