为什么它在我的mapview中显示最后一个引脚的调用注释类型

时间:2011-09-22 10:50:14

标签: iphone google-maps mkannotationview mkpinannotationview mapkit

我正在设计一个地图视图,其中我没有丢弃。针脚。我还在每个引脚上添加了一个自定义视图。现在的问题是,当我的地图视图添加所有引脚然后在地图上它不会显示我的最后一个引脚。它不是最后一个引脚,而是仅显示自定义视图,当我点击它时,它不会被隐藏。在某些引脚上它不会添加自定义视图。我在下面显示我的代码...... 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;

}

class.m

 - (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];
}

}

1 个答案:

答案 0 :(得分:0)

不确定,但我认为问题可能是在viewDidLoad的初始循环期间,您正在记住self.calloutAnnotation中的注释,然后在didSelect和didDeselect中检查它。

问题是每次循环都会替换self.calloutAnnotation,所以最后,它只会引用添加的最后一个注释。例如,当用户选择不同的注释时,您可以更改self.calloutAnnotation的lat / long并再次添加它,但这将更改数组中添加的最后一个注释的纬度/经度。