почему он показывает аннотацию последнего пин-кода в моем представлении карты

Я разрабатываю представление карты, в котором я опускаю нет. штифтов. Я также добавил настраиваемый вид для каждого контакта. Теперь проблема в том, что когда мой вид карты добавляет все булавки, то на карте не отображается моя последняя булавка. Вместо последней булавки будет отображаться только пользовательский вид, который не скрывается, когда я нажимаю на него. И на некоторых булавках он не добавляет пользовательский вид. Я показываю свой код ниже... class.h

@interface MappingBusinesses : UIViewController {

MKMapView *_mapView;
CalloutMapAnnotation *_calloutAnnotation;
MKAnnotationView *_selectedAnnotationView;
Places *Place_Object;
DisplayMap *dm;
NSMutableArray *routepoints;
CSMapRouteLayerView *routeView;
UICRouteOverlayMapView *routeOverlayView;
UICGDirections *diretions;
Yelp_OnTheWayAppDelegate *appDelegate;
NSArray *wayPoints;
UICGTravelModes travelMode;
DetailView *DV_Object;
UIActivityIndicatorView *aiv;
UILabel *label;
UIView *prosView;
BusinessData *bd_object;

}

класс.м

 - (void)viewDidLoad {
[super viewDidLoad];

 appDelegate = (Yelp_OnTheWayAppDelegate *)[[UIApplication sharedApplication] delegate];
self.title=@"Map";
//[NSThread detachNewThreadSelector:@selector(start) toTarget:self withObject:nil];
label.text=[NSString stringWithFormat:@"%d places along your route",[appDelegate.busines_Aray count]];
[self.mapView setMapType:MKMapTypeStandard];
[self.mapView setZoomEnabled:YES];
[self.mapView setScrollEnabled:YES];
[self.mapView setDelegate:self];
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = appDelegate.start_lat;
region.center.longitude = appDelegate.start_long;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;  
[self.mapView setRegion:region animated:YES];

dm=[[DisplayMap alloc]init];
for(int i=0;i<[appDelegate.mapPin_aray count];i++)
{
    CLLocationCoordinate2D coord; 
    coord.latitude=[[appDelegate.mapPin_lat objectAtIndex:i] floatValue];
    coord.longitude=[[appDelegate.mapPin_long objectAtIndex:i] floatValue];
    self.calloutAnnotation = [[CalloutMapAnnotation alloc] initWithLatitude:coord.latitude andLongitude:coord.longitude] ;
    [self.mapView addAnnotation:self.calloutAnnotation];
    NSLog(@"coordinate of number%i is %f and %f",i,coord.latitude,coord.longitude);

    }

}

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

if ([annotation isKindOfClass:[MKUserLocation class]]) {
    return nil;     
}
static NSString *identifier = @"RoutePinAnnotation";
if ([annotation isKindOfClass:[UICRouteAnnotation class]]) {
    MKPinAnnotationView *pinAnnotation = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if(!pinAnnotation) {
        pinAnnotation = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
    }

    if ([(UICRouteAnnotation *)annotation annotationType] == UICRouteAnnotationTypeStart) {
        pinAnnotation.pinColor = MKPinAnnotationColorGreen;
    } else if ([(UICRouteAnnotation *)annotation annotationType] == UICRouteAnnotationTypeEnd) {
        pinAnnotation.pinColor = MKPinAnnotationColorPurple;
    } else {
        pinAnnotation.pinColor = MKPinAnnotationColorPurple;
    }

    pinAnnotation.animatesDrop = YES;
    pinAnnotation.enabled = YES;
    pinAnnotation.canShowCallout = YES;
    return pinAnnotation;
} 

static NSString * const kPinAnnotationIdentifier = @"PinIdentifier";
 if (annotation == self.calloutAnnotation) {
    CalloutMapAnnotationView *calloutMapAnnotationView = (CalloutMapAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:kPinAnnotationIdentifier];
    if (!calloutMapAnnotationView) {
        calloutMapAnnotationView = [[[CalloutMapAnnotationView alloc] initWithAnnotation:annotation 
                                                                         reuseIdentifier:@"CalloutAnnotation"] autorelease];
        calloutMapAnnotationView.contentHeight = 70.0f;
        bd_object=[appDelegate.busines_Aray objectAtIndex:self.calloutAnnotation.pinID];
        UITextField *txtname=[[UITextField alloc] initWithFrame:CGRectMake(0, 5, 150, 30)];
        txtname.text=[NSString stringWithFormat:@"%@",bd_object.name_business ];
        txtname.userInteractionEnabled=NO;
        txtname.font = [UIFont boldSystemFontOfSize:18];
        txtname.font=[UIFont fontWithName:@"Arial" size:18];
        txtname.textColor = [UIColor whiteColor];
        txtname.opaque = false;
        txtname.backgroundColor = [UIColor clearColor];
        [calloutMapAnnotationView.contentView addSubview:txtname];
        [txtname release];

        UILabel *gpsCoordinatesLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, 70, 20)];
        gpsCoordinatesLabel.text = @"Categories:";
        gpsCoordinatesLabel.font = [UIFont boldSystemFontOfSize:14];
      gpsCoordinatesLabel.font=[UIFont fontWithName:@"Arial" size:14];
        gpsCoordinatesLabel.textColor = [UIColor whiteColor];
        gpsCoordinatesLabel.opaque = false;
        gpsCoordinatesLabel.backgroundColor = [UIColor clearColor];
        gpsCoordinatesLabel.textAlignment = UITextAlignmentRight;
        [calloutMapAnnotationView.contentView addSubview:gpsCoordinatesLabel];
        [gpsCoordinatesLabel release];

        UITextField *txtcate=[[UITextField alloc] initWithFrame:CGRectMake(70, 40, 100, 30)];
        txtcate.text=[NSString stringWithFormat:@"%@", bd_object.cat_business];
        txtcate.userInteractionEnabled=NO;
        txtcate.font = [UIFont boldSystemFontOfSize:18];
        txtcate.font=[UIFont fontWithName:@"Arial" size:18];
        txtcate.textColor = [UIColor whiteColor];
        txtcate.opaque = false;
        txtcate.backgroundColor = [UIColor clearColor];
        [calloutMapAnnotationView.contentView addSubview:txtcate];
        [txtcate release];

        UITextField *txtReview=[[UITextField alloc] initWithFrame:CGRectMake(190, 40, 40, 30)];
        txtReview.text=[NSString stringWithFormat:@"%d", bd_object.noofreview];
        txtReview.userInteractionEnabled=NO;
        txtReview.font = [UIFont boldSystemFontOfSize:18];
        txtReview.textColor = [UIColor whiteColor];
        txtReview.opaque = false;
        txtReview.backgroundColor = [UIColor clearColor];
        [calloutMapAnnotationView.contentView addSubview:txtReview];
        [txtReview release];

        UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(210, 40, 31, 23)];
        [imgView setImage:[UIImage imageNamed:@"reviewwhite.png"]];
        [calloutMapAnnotationView.contentView addSubview:imgView];
        [imgView release];


    }
    calloutMapAnnotationView.parentAnnotationView = self.selectedAnnotationView;
    calloutMapAnnotationView.mapView = self.mapView;

    return calloutMapAnnotationView;
} 

else {
    MKPinAnnotationView *annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                                                                           reuseIdentifier:@"CustomAnnotation"] autorelease];
    annotationView.canShowCallout = NO;
    annotationView.pinColor = MKPinAnnotationColorRed;
    return annotationView;
} 

MKAnnotationView *av;
return av;

}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
if (self.calloutAnnotation != nil) {
    self.calloutAnnotation = [[CalloutMapAnnotation alloc] initWithLatitude:view.annotation.coordinate.latitude andLongitude:view.annotation.coordinate.longitude];
} else {
    self.calloutAnnotation.latitude = view.annotation.coordinate.latitude;
    self.calloutAnnotation.longitude = view.annotation.coordinate.longitude;
}

[self.mapView addAnnotation:self.calloutAnnotation];
self.selectedAnnotationView = view;

}

 - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
if (self.calloutAnnotation != nil) {
    [self.mapView removeAnnotation: self.calloutAnnotation];
}

}


person iRavan12    schedule 22.09.2011    source источник


Ответы (1)


Не уверен, но я думаю, что проблема может заключаться в том, что во время вашего начального цикла в viewDidLoad вы помните аннотации в self.calloutAnnotation, а затем проверяете их в didSelect и didDeselect.

Проблема в том, что self.calloutAnnotation будет заменяться каждый раз вокруг цикла инициализации, поэтому в конце он будет ссылаться только на последнюю добавленную аннотацию. Например, когда пользователь выбирает другую аннотацию, вы меняете широту/долготу self.calloutAnnotation и добавляете ее снова, но это изменит широту/долготу последней аннотации, добавленной в массив.

person mackworth    schedule 22.09.2011