1

私はスタンフォード iOS クラスを受講しています (申し訳ありませんが、私はこれらの連中の 1 人ですが、どうにかして学ばなければならないと思います)、MKMapViews に関する講義で教授が使用したコードとほぼ同じコードを使用していますが、私は彼がしなかったこの例外を受け取っています、そして私は本当にそれを理解することができません. 何が原因でしょうか?

私が得ている例外:

-[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.
}
4

2 に答える 2

5

渡したパラメータが実際にはではない場合、-[NSConcreteData _isResizable]: unrecognized selector sent to instanceを呼び出すときにエラーが発生する可能性がsetImageあります。UIImageViewUIImage

あなたのコメントによると、getImageForMapViewControllerメソッドは実際にNSDataはの代わりに返されUIImageます。これにより、表示されているエラーが発生する可能性があります。

getImageForMapViewControllerを返すようにメソッドを修正しUIImageます。

于 2012-08-14T19:31:08.343 に答える
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.
}

ここでの問題は、leftCalloutAccessoryViewがタイプであるということですUIView。に設定しようとしimageていUIViewます。メソッドUIViewに応答しないでください。setImageキャストしようとしている画像を に設定した後UIViewUIImageViewそれは悪い習慣です。そのため、imageView にイメージを追加する必要があります。その後、imageView を として割り当てる必要がありますleftCalloutAccessoryView

このように書き込もうとするときは[(UIImageView *)view.leftCalloutAccessoryView setImage:image];、最初にキャストしてからメソッドを呼び出すことを忘れないでください。上記の行については、次のように書く方が良いです。

UIImageView *imgView = (UIImageView *)view.leftCalloutAccessoryView;
[imgView setImage:image];
于 2012-08-14T18:54:01.540 に答える