2012-08-14 61 views
1

我正在参加斯坦福大学的iOS课程(对不起,我是其中一个人,但我想我应该学习),并且我使用的代码与prof中使用的代码几乎完全相同关于MKMapViews的讲座,但我得到这个例外,他没有,我真的不知道。什么可能导致这个?为什么我得到一个无法识别的选择器与我的MapViewController发送到实例异常? (iOS)

例外我越来越:

- [NSConcreteData _isResizable]:无法识别的选择发送到实例0x90a4c00

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

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    UIImage *image = [self.delegate getImageForMapViewController:self withAnnotation:view.annotation]; 
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image]; // this is where I get the exception. 
} 
+0

什么是无法识别的选择器?如果您单步执行,哪行代码会生成异常? – 2012-08-14 18:42:19

+0

setImage:最后一行代码中的图片 – 2012-08-14 18:45:29

+1

发布一些关于您的例外的更多细节...现在我没有看到任何错误。无法识别的选择器意味着您正试图在没有它的对象上调用方法。 – Dustin 2012-08-14 18:46:49

回答

5

错误-[NSConcreteData _isResizable]: unrecognized selector sent to instance可以调用一个UIImageViewsetImage时,如果传递的参数是不是一个真正的UIImage发生。

根据您的意见,getImageForMapViewController方法实际上是返回NSData而不是UIImage。这可能会导致您看到的错误。

修复getImageForMapViewController方法返回UIImage

1

如果您需要更改MKPinAnnotationView使用等的图像:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    MKAnnotation *pin = view.annotation; 
    UIImage *image = [self.delegate getImageForMapViewController:self withAnnotation:view.annotation]; 

    UIImageView *imagePin = [[UIImageView alloc] initWithImage:image]; 
    [[mapView viewForAnnotation:pin] addSubview:imagePin]; 
} 

这是问题,更改这个方法:

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    UIImage *image = [self.delegate getImageForMapViewController:self withAnnotation:view.annotation]; 
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image]; // this is where I get the exception. 
} 

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    UIImage *image = [self.delegate getImageForMapViewController:self withAnnotation:view.annotation]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    view.leftCalloutAccessoryView = imageView; // this is where I get the exception. 
} 

这里的问题是,leftCalloutAccessoryViewUIView类型。您正试图在UIView上设置imageUIView不响应setImage方法。在设置图像后,您试图将UIView转换为UIImageView,这是一个坏习惯。因此,您需要将图像添加到imageView之后,您需要将imageView指定为leftCalloutAccessoryView

当你试图像这样写[(UIImageView *)view.leftCalloutAccessoryView setImage:image];记得先施放它然后调用该方法。对于上面的线最好是写像,

UIImageView *imgView = (UIImageView *)view.leftCalloutAccessoryView; 
[imgView setImage:image]; 
+2

只要注解可以显示标注为什么它是MKPinAnnotationView还是通用的? – 2012-08-14 19:01:30

+0

@JonAird这似乎不是问题所在。 – 2012-08-14 19:03:28

+0

@Midhun MP:所有注解视图都支持leftCalloutAccessoryView,它是_callout_上的视图 - 而不是注释本身的图像。 – Anna 2012-08-14 19:14:56

相关问题