0

更新が完了すると、PIn カラー mapView に問題が発生します。私のアプリでは、サービスが利用可能かどうかを識別するために、2 色のポイントを表示します。最初の起動時には、問題は発生しません。コードは次のとおりです。

    - (void)viewDidLoad
{
    [super viewDidLoad];
    [self dowloadPoint];    // here I exucte the first start 

}

- (void)dowloadPoint{
    NSURL *url1 =[NSURL URLWithString:@"http:MYUSRL"];
    NSData *datos1 =[[NSData alloc] initWithContentsOfURL:url1];

        [self plotBarPosition:datos_string1];     //Here I call the plotBarPosition method
}


- (void)plotBarPosition:(NSString *)datos_string1 {

    for (id<MKAnnotation> annotation in _mapView.annotations) {
        [_mapView removeAnnotation:annotation];
    }

    // Parse the string into JSON
    NSDictionary *json = [(NSDictionary*)[datos_string1 JSONValue]objectForKey:@"features"];

    // Get the objects you want, e.g. output the second item's client id
    NSArray *items_properties = [json valueForKeyPath:@"properties"];
    NSArray *items_geo = [json valueForKeyPath:@"geometry"];

        for (int i = 0; i < [json count]; i++){

            NSString *nomprePunto =[[items_properties objectAtIndex:i] objectForKey:@"title"]; 

            NSNumber *lat =[[[items_geo objectAtIndex:i] objectForKey:@"coordinates"] objectAtIndex:0];


            NSNumber *lon =[[[items_geo objectAtIndex:i] objectForKey:@"coordinates"] objectAtIndex:1];

            CLLocationCoordinate2D coordinate;
            coordinate.latitude = lat.doubleValue;
            coordinate.longitude = lon.doubleValue;

            //ESTADO
            NSString *description = [[items_properties objectAtIndex:i] objectForKey:@"description"];
            NSString *estado_punto = [[NSString alloc]init];

            if ([description rangeOfString:@"Averiado"].location == NSNotFound) {
                estado_punto = @"Available";
            } else {
                estado_punto = @"NOt Available";
                averiados ++;
             }
            NSString *averiadosStr = [NSString stringWithFormat:@"%d",averiados];
           averiadosLabel.text = averiadosStr;

            MyLocation *location =[[MyLocation alloc] initWithName:nomprePunto coordinate:coordinate estado:estado_punto];

            [_mapView addAnnotation:location];
    }


}



- (MKPinAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MyLocation *)annotation {

        static NSString *identifier = @"MyLocation";
        if ([annotation isKindOfClass:[MyLocation class]]) {
            MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

            if (annotationView == nil) {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

                annotationView.enabled = YES;
                annotationView.canShowCallout = YES;

                if([[annotation estado] isEqualToString:@"En Servicio"])
                annotationView.pinColor = MKPinAnnotationColorGreen;

                } else {
                annotationView.annotation = annotation;
            }

            return annotationView;
        }

        return nil;
    }

しかし、関数であるrefresボタンを追加すると、dowloadPointをもう一度呼び出すだけで、

- (IBAction)refresh{

    [self dowloadPoint];
}

ピンの色は「ランダムな方法」で変化し、ポイントの実際の状態とは一致しません。何が起こっているかについてのアイデアはありますか?前もって感謝します。

編集:問題が原因のようです:

for (id<MKAnnotation> annotation in _mapView.annotations) {
    [_mapView removeAnnotation:annotation];
}

それを消去すると、アプリは正常に動作しますが、ピン領域は以前のものよりも溺れています...:S

4

1 に答える 1

1

ピンのデフォルトの色は赤です。estadoオブジェクトのプロパティMyLocationが と等しい場合は、緑に設定します@"En Servicio"estadoプロパティが に等しい場合は色が赤で、@"En Servicio"そうでない場合は緑になることがあります。
理由の 1 つMyLocationは、更新ボタンを押したときにオブジェクトが存在しなくなっている可能性があります。この場合、かつて存在していたメモリの場所へのポインターがまだ残っている可能性がありますが、この場所は何かによって上書きされ、ランダムな色になっている可能性があります。
これは、たとえば、MyLocationオブジェクトが自動解放オブジェクトとして作成され、メイン イベント ループに戻ったときに解放された場合、つまりユーザー インタラクションを処理する場合に発生する可能性があります。
これは、ARC を使用している場合には当てはまりません。

于 2013-03-27T13:35:00.100 に答える