我不知道我做错了什么,但它不会工作。
我的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];
}
在记录的帮助下,我知道图像的网址和数据都没问题,而图像本身并不是零,但左侧标注中没有显示任何内容。
有人可以建议我如何找出这个问题的根源?
我添加了一些日志,所以我可以看到发生了什么:
- (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:
所有左侧标注配件都有他们应该的图像,但关闭源我想按需下载图像
答案 0 :(得分:5)
问题是,你使用
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
何时使用
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
干杯)
答案 1 :(得分:2)
如果您从变量加载图像,我认为您的didSelectAnnotationView方法不起作用。如果是这样,您需要参考原始注释:
-(void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
MyAnnotation *pin = (MyAnnotation *) [view annotation];
view.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:pin.flag]];
}
希望这能增强原来的答案......:)
答案 2 :(得分:1)
在我的作品中,我有一个从MapViewController到UIImageView的推送segue,其中标识符为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>
答案 3 :(得分: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;
});
});
}
}
这意味着它只是开始下载它,当它完成时,它动画视图为图像腾出空间。