Objective c 为什么使用MapViewController将无法识别的选择器发送到实例异常?(iOS)
我正在上斯坦福iOS课程抱歉,我是这些人中的一员,但我想我必须要学习一些东西,我使用的代码几乎与教授在关于MKMapViews的讲座中使用的代码完全相同,但我得到了一个例外,他没有,我真的无法理解。这可能是什么原因造成的 我得到的例外情况是: -[nsConcertedata\u IsResizeable]:发送到实例0x90a4c00的无法识别的选择器Objective c 为什么使用MapViewController将无法识别的选择器发送到实例异常?(iOS),objective-c,ios,unrecognized-selector,cs193p,Objective C,Ios,Unrecognized Selector,Cs193p,我正在上斯坦福iOS课程抱歉,我是这些人中的一员,但我想我必须要学习一些东西,我使用的代码几乎与教授在关于MKMapViews的讲座中使用的代码完全相同,但我得到了一个例外,他没有,我真的无法理解。这可能是什么原因造成的 我得到的例外情况是: -[nsConcertedata\u IsResizeable]:发送到实例0x90a4c00的无法识别的选择器 如果需要更改MKPinAnnotationView的图像,请使用以下方法: -(void)mapView:(MKMapView *)mapVi
如果需要更改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.
}
到
这里的问题是leftCalloutAccessoryView的类型是UIView。您正在尝试在UIView上设置图像。UIView不响应setImage方法。设置要将UIView强制转换为UIImageView的图像后,这是一个坏习惯。因此,您需要将图像添加到imageView,然后需要将imageView指定为leftCalloutAccessoryView
当您尝试这样编写时[UIImageView*view.leftCalloutAccessoryView setImage:image];记住先强制转换它,然后调用该方法。对于上面这一行,最好是这样写
UIImageView *imgView = (UIImageView *)view.leftCalloutAccessoryView;
[imgView setImage:image];
如果需要更改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.
}
到
这里的问题是leftCalloutAccessoryView的类型是UIView。您正在尝试在UIView上设置图像。UIView不响应setImage方法。设置要将UIView强制转换为UIImageView的图像后,这是一个坏习惯。因此,您需要将图像添加到imageView,然后需要将imageView指定为leftCalloutAccessoryView
当您尝试这样编写时[UIImageView*view.leftCalloutAccessoryView setImage:image];记住先强制转换它,然后调用该方法。对于上面这一行,最好是这样写
UIImageView *imgView = (UIImageView *)view.leftCalloutAccessoryView;
[imgView setImage:image];
错误-[NSConcreteData\u isResizable]:如果要传递的参数实际上不是UIImage,则在UIImageView上调用setImage时,可能会发生发送到实例的无法识别的选择器
根据您的评论,getImageFormAppViewController方法实际上返回的是NSData,而不是UIImage。这可能会导致您看到的错误
修复GetImageFormAppViewController方法以返回UIImage。错误-[NSConcreteData\u isResizable]:如果传递的参数不是UIImage,则在UIImageView上调用setImage时可能会发生发送到实例的无法识别的选择器
根据您的评论,getImageFormAppViewController方法实际上返回的是NSData,而不是UIImage。这可能会导致您看到的错误
修复GetImageFormAppViewController方法以返回UIImage。无法识别的选择器是什么?如果您只执行一个步骤,那么哪行代码会生成异常?请发布有关异常的更多详细信息。。。现在我看不出有什么不对劲。无法识别的选择器意味着您正试图对一个没有它的对象调用一个方法。-1因为没有发布异常数据+1因为我想在Stanford学习一个类的时候必须学习,但是您确认它是UIImage类型吗?如果getImageForMapViewController错误地返回UIImage以外的内容,则可能导致您看到的错误。无法识别的选择器是什么?如果您只执行一个步骤,那么哪行代码会生成异常?请发布有关异常的更多详细信息。。。现在我看不出有什么不对劲。无法识别的选择器意味着您正试图对一个没有它的对象调用一个方法。-1因为没有发布异常数据+1因为我想在Stanford学习一个类的时候必须学习,但是您确认它是UIImage类型吗?如果getImageForMapViewController错误地返回UIImage以外的内容,这可能会导致您看到的错误。只要批注可以显示标注,为什么它是MKPinAnnotationView还是通用视图很重要?@JonAird这似乎不是问题所在。@Midhun MP:所有批注视图都支持leftCalloutAccessoryView,它是标注上的视图,而不是批注本身的图像。只要注释可以显示标注为什么它是MKPinAnnotationView还是通用视图很重要?@JonAird这似乎不是问题。@Midhun MP:所有注释视图都支持leftCalloutAccessoryView,它是标注上的视图,而不是注释本身的图像。