0

私はIOSでプログラムを書いており、地図上のいくつかのスポットをピンでマークしています。これで、1 つのピンで正常に動作する dequereusableannotationview コードができましたが、2 つのピンを使用するか、マップ上の 2 つのポイントをマークしようとするとクラッシュします。IT は、1 つの注釈をコメント アウトするか、デキュー コードをコメント アウトした場合にのみ機能します。私がこれまでに持っているピンの数はおそらく... 10..?

ありがとうございます

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

    MKMapView *mv=[[MKMapView alloc]initWithFrame:CGRectZero];
    mv.delegate=self;
    [self setView:mv];

    MapAnnotation* ann=[[MapAnnotation alloc]init];
    CLLocationCoordinate2D location;
    location.latitude=(double)51.501468;
    location.longitude=(double)-0.141596;
    [ann setCoordinate:location];
    [ann setTitle:@"test"];
    [ann setTitle:@"plz work"];
    [mv addAnnotation:ann];
    [ann release];

    MapAnnotation* AnnB=[[MapAnnotation alloc]init];
    CLLocationCoordinate2D locationB;
    locationB.latitude=(double)16.4944;
    locationB.longitude=(double)-151.7364;
    [AnnB setCoordinate:locationB];
    [AnnB setTitle:@"test"];
    [AnnB setSubtitle:@"work"];

    [mv addAnnotation:AnnB];
    [AnnB release];
}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    MKPinAnnotationView *pinView=nil;

    if (annotation!=mapView.userLocation) {
        static NSString *defaultID=@"MYLoction";

        pinView=(MKPinAnnotationView *)[mapView
                                        dequeueReusableAnnotationViewWithIdentifier:defaultID];
        if (pinView=nil) {
            pinView=[[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:defaultID]autorelease];

            pinView.pinColor=MKPinAnnotationColorPurple;
            pinView.canShowCallout=YES;
            pinView.animatesDrop=YES;
        }
    }
}
4

2 に答える 2

0

1 つの問題は、等しいかどうかをテストするときに

if (pinView=nil) {

=等値演算子 の代わりに代入演算子 を使用しています==。これは毎回nilに割り当てられるため、アノテーションを再利用することはありません。pinViewコンパイラがこれをキャッチしなかったことに驚いています。

また、実際には何も返していませんviewForAnnotation:。代わりにこれを試してください:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:
    (id<MKAnnotation>)annotation {
    if(annotation == mapView.userLocation) {
        return nil;
    }

    static NSString *defaultID=@"MYLoction";

    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView 
        dequeueReusableAnnotationViewWithIdentifier:defaultID];

    if (!pinView) {
        pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
            reuseIdentifier:defaultID] autorelease];

        pinView.pinColor=MKPinAnnotationColorPurple;
        pinView.canShowCallout=YES;
        pinView.animatesDrop=YES;
    }

    return pinView;
}
于 2012-07-23T16:37:26.313 に答える
0

適切な変更を加えてこのコードを試してください。次のコードは私にとってはうまくいきます。

  • (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {

    static NSString *identifier = @"MyLocation";
    if ([注釈 isKindOfClass:[MNMyLocation クラス]]) {

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [atmLocatorMap dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    } else {
        annotationView.annotation = annotation;
    }
    
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    //annotationView.image=[UIImage imageNamed:@"arrest.png"];
    
    return annotationView;
    

    }

    ゼロを返します。

} `

于 2012-07-23T16:57:47.933 に答える