使用AVSpeechSynthesizer读取地图上的位置描述

我的地图有4或5个彼此接近的点,现在使用AVSpeechSynthesizer我已经知道它的位置名称(也显示在一个小泡泡)。

我希望它仍然显示泡沫,但点击时,我希望它说我将指定的地方的描述。 这是我目前的代码:

MapViewAnnotation.h

@interface MapViewAnnotation : NSObject <MKAnnotation> { NSString *title; CLLocationCoordinate2D coordinate; NSString *desc; } @property (nonatomic, copy) NSString *title; @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; @property (nonatomic, readonly) NSString *desc; - (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d initWithDesc:(NSString *)dsc; 

MapViewAnnotation.m

 @implementation MapViewAnnotation @synthesize title, coordinate, desc; - (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d initWithDesc:(NSString *)dsc { [super init]; title = ttl; coordinate = c2d; desc = dsc; return self; 

MapViewController.h

 @interface MapViewController : UIViewController { MKMapView *mapView; } @property (nonatomic, retain) IBOutlet MKMapView *mapView; @property (strong, nonatomic) AVSpeechSynthesizer *synthesizer; 

MapViewController.m

 - (void)viewDidLoad { // Set some coordinates for our position : Cutty Sark CLLocationCoordinate2D location; location.latitude = (double) 51.482997; location.longitude = (double) -0.010072; // Royal Observatory CLLocationCoordinate2D twoLocation; twoLocation.latitude = (double) 51.477805; twoLocation.longitude = (double) -0.001430; //Royal Naval College CLLocationCoordinate2D threeLocation; threeLocation.latitude = (double) 51.483344; threeLocation.longitude = (double) -0.006799; //Queen's House CLLocationCoordinate2D fourLocation; fourLocation.latitude = (double) 51.481383; fourLocation.longitude = (double) -0.003722; //National Maritime Museum CLLocationCoordinate2D fiveLocation; fiveLocation.latitude = (double) 51.481050; fiveLocation.longitude = (double) -0.005578; // Add Cutty Sark annotation to MapView MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Cutty Sark" andCoordinate:location initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; self.mapView.delegate = self; [newAnnotation release]; // Add Royal Observatory annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Royal Observatory" andCoordinate:twoLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add Royal Naval College annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Royal Naval College" andCoordinate:threeLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add Queen's House annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Queen's House" andCoordinate:fourLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add National Maritime Museum annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"National Maritime Museum" andCoordinate:fiveLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; } - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)anView { AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init]; AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:((MapViewAnnotation *)anView).desc]; [utterance setRate:0.5]; [synthesizer speakUtterance:utterance]; } // When a map annotation point is added, zoom to it (1500 range) - (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views { MKAnnotationView *annotationView = [views objectAtIndex:0]; id <MKAnnotation> mp = [annotationView annotation]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 1500, 1500); [mv setRegion:region animated:YES]; //[mv selectAnnotation:mp animated:YES]; } 

任何帮助,将不胜感激!

编辑这里是NSLog:

在这里输入图像说明

didSelectAnnotationView委托方法中, anView参数是MKAnnotationView

也就是说, anView是注释的视图MKAnnotationViewMKPinAnnotationView类)的对象。

它不是注解的模型 (您的MapViewAnnotation类)对象。

要引用视图的注释模型实例,请使用视图的annotation属性并将其转换为类:

 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)anView { //Get a reference to the annotation this view is for... id<MKAnnotation> annSelected = anView.annotation; //Before casting, make sure this annotation is our custom type //(and not some other type like MKUserLocation)... if ([annSelected isKindOfClass:[MapViewAnnotation class]]) { MapViewAnnotation *mva = (MapViewAnnotation *)annSelected; AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init]; AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:mva.desc]; [utterance setRate:0.5]; [synthesizer speakUtterance:utterance]; } }