如何在地图视图中将标注添加到单个注释中

我正在尝试使用不同的标注详细信息设置每个注释。

目前,当我点击任何注释位置时,它会显示所有标注信息。

#import "AnnotationViewController.h" #import "Annotation.h" @implementation AnnotationViewController @synthesize mapView; -(void)viewDidLoad { [super viewDidLoad]; [mapView setMapType:MKMapTypeStandard]; [mapView setZoomEnabled:YES]; [mapView setScrollEnabled:YES]; [mapView setDelegate:self]; MKCoordinateRegion TT = { {0.0, 0.0} , {0.0, 0.0} }; TT.center.latitude = 43.65343; TT.center.longitude = -79.396311; TT.span.longitudeDelta = 0.02f; TT.span.latitudeDelta = 0.02f; [mapView setRegion:TT animated:YES]; Annotation *ann1 = [[Annotation alloc] init]; ann1.title = @"Annotation 01"; ann1.subtitle = @"Message 01"; ann1.coordinate = TT.center; [mapView addAnnotation:ann1]; MKCoordinateRegion TTY = { {0.0, 0.0} , {0.0, 0.0} }; TTY.center.latitude = 43.76919; TTY.center.longitude = -79.41245; TTY.span.longitudeDelta = 0.02f; TTY.span.latitudeDelta = 0.02f; [mapView setRegion:TTY animated:YES]; Annotation *ann2 = [[Annotation alloc] init]; ann2.title = @"Annotation 02"; ann2.subtitle = @"Message 02"; ann2.coordinate = TTY.center; [mapView addAnnotation:ann2]; } -(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:id)annotation { MKPinAnnotationView *view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"]; view.pinColor = MKPinAnnotationColorPurple; view.enabled = YES; view.animatesDrop = YES; view.canShowCallout = YES; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"GPSicon.png"]]; view.leftCalloutAccessoryView = imageView; view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; return view; } - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { NSString *msg = [@"Location 01" stringByAppendingFormat:@"Opening 01"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Plaza 01" message:msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; NSString *msg02 = [@"Location 02" stringByAppendingFormat:@"Opening 02"]; UIAlertView *alert02 = [[UIAlertView alloc] initWithTitle:@"Plaza 02" message:msg02 delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert02 show]; } -(void)button:(id)sender { NSLog(@"Button action"); } - (void)dealloc { } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } end 

所以这就是发生的事情:当我点击“注释01”时,会出现气泡。 但是当我点击标注“详细图标”时,它会弹出位置01和位置2标题。


谢谢安娜的帮助。 但是当我检查一个注释时,我仍然会得到2个标注。 这是现在的代码..

 #import "AnnotationViewController.h" #import "Annotation.h" @implementation AnnotationViewController @synthesize mapView; -(void)viewDidLoad { [super viewDidLoad]; [mapView setMapType:MKMapTypeStandard]; [mapView setZoomEnabled:YES]; [mapView setScrollEnabled:YES]; [mapView setDelegate:self]; MKCoordinateRegion TT = { {0.0, 0.0} , {0.0, 0.0} }; TT.center.latitude = 43.65343; TT.center.longitude = -79.396311; TT.span.longitudeDelta = 0.02f; TT.span.latitudeDelta = 0.02f; [mapView setRegion:TT animated:YES]; Annotation *ann1 = [[Annotation alloc] init]; ann1.title = @"Annotation 01"; ann1.subtitle = @"Message 01"; ann1.coordinate = TT.center; [mapView addAnnotation:ann1]; MKCoordinateRegion TTY = { {0.0, 0.0} , {0.0, 0.0} }; TTY.center.latitude = 43.76919; TTY.center.longitude = -79.41245; TTY.span.longitudeDelta = 0.02f; TTY.span.latitudeDelta = 0.02f; [mapView setRegion:TTY animated:YES]; Annotation *ann2 = [[Annotation alloc] init]; ann2.title = @"Annotation 02"; ann2.subtitle = @"Message 02"; ann2.coordinate = TTY.center; [mapView addAnnotation:ann2]; } -(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:id)annotation { MKPinAnnotationView *view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"]; view.pinColor = MKPinAnnotationColorPurple; view.enabled = YES; view.animatesDrop = YES; view.canShowCallout = YES; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"GPSicon.png"]]; view.leftCalloutAccessoryView = imageView; view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; return view; } - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { //first make sure the annotation is our custom class... if ([view.annotation isKindOfClass:[Annotation class]]) { //cast the object to our custom class... Annotation *ann1 = (Annotation *)view.annotation; //show one alert view with title set to annotation's title //and message set to annotation's subtitle... UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ann1.title message:ann1.subtitle delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } //first make sure the annotation is our custom class... if ([view.annotation isKindOfClass:[Annotation class]]) { //cast the object to our custom class... Annotation *ann2 = (Annotation *)view.annotation; //show one alert view with title set to annotation's title //and message set to annotation's subtitle... UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:ann2.title message:ann2.subtitle delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } -(void)button:(id)sender { NSLog(@"Button action"); } - (void)dealloc { } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } end 

我的Annotation.m文件代码

 #import "Annotation.h" @implementation Annotation @synthesize coordinate, title, subtitle; -(void)dealloc { } @end 

我的Annotation.h文件代码

 #import  #import  @interface Annotation : NSObject  { CLLocationCoordinate2D coordinate; NSString *title; NSString *subtitle; } @property(nonatomic, assign) CLLocationCoordinate2D coordinate; @property(nonatomic, copy) NSString *title; @property(nonatomic, copy) NSString *subtitle; @end 

我是否必须为每个注释制作大量h / m文件以使标注不同? 我只是踩到这一点。 任何猜测都会很棒,谢谢!

calloutAccessoryControlTapped ,代码显示两个警报视图,其中包含标题和消息的硬编码文本。 这就是你明显得到的。

calloutAccessoryControlTapped方法中,可以通过view.annotation获取其标注按钮被轻击的注释对象。

view参数是MKAnnotationView ,它具有指向其相关注释的annotation属性。

因此,更改代码以仅显示一个警报视图,并根据注释对象的属性显示标题和消息。

检查注释的类以确保它是您期望的注释类型也是一个好主意。

例如:

 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { //first make sure the annotation is our custom class... if ([view.annotation isKindOfClass:[Annotation class]]) { //cast the object to our custom class... Annotation *ann = (Annotation *)view.annotation; //show one alert view with title set to annotation's title //and message set to annotation's subtitle... UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ann.title message:ann.subtitle delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } }