注释标注标题不会更改

我已经搜查,但我没有find任何解决我的问题。 我想改变已经添加的引脚。 这是我的代码。 我在控制台中看到“Code Here”。

我在.h

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView; 

myViewController.m

 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView { userPins *myAnnot = (userPins *)annotationView.annotation; [myAnnot setTitle:@"o21"]; NSLog(@"Code here!"); } - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { static NSString *identifier = @"userPins"; if ([annotation isKindOfClass:[userPins class]]) { MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; if (annotationView == nil) { annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; } else { annotationView.annotation = annotation; } annotationView.image = [UIImage imageNamed:@"mapMarker-blue.png"]; annotationView.calloutOffset = CGPointMake(0,0); UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; annotationView.rightCalloutAccessoryView = detailButton; annotationView.enabled = YES; annotationView.canShowCallout = YES; return annotationView; } return nil; } 

在userPins.mi中有。 但是我也没有用setTitle来做这个。

 - (void)setTitle:(NSString *)title { if (_subtitle != subtitle) { [_subtitle release]; _subtitle = [subtitle retain]; } } - (NSString *)title{ return @"okan"; } 

编辑:@AnnaKarenina

我已经尝试了所有。 但是setTitle没有运行。 我要疯了! 这是我所有的代码。 而我没有得到错误。

userpins.m

 #import "userPins.h" @implementation userPins @synthesize fbid = _fbid; @synthesize coordinate = _coordinate; @synthesize title = _title; @synthesize subtitle = _subtitle; - (id)initWithfbid:(NSInteger*)fbid coordinate:(CLLocationCoordinate2D)coordinate { if ((self = [super init])) { _fbid = fbid; _coordinate = coordinate; } return self; } - (NSString *)subtitle{ return @"Anything"; } - (NSString *)title{ return @"Something"; } - (void)dealloc { [_title release]; [_subtitle release]; [super dealloc]; } @end 

userPins.h

 #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface userPins : NSObject <MKAnnotation> { NSInteger *_fbid; CLLocationCoordinate2D _coordinate; NSString *_title; NSString *_subtitle; } @property (nonatomic, readonly) NSInteger *fbid; @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; - (id)initWithfbid:(NSInteger*)fbid coordinate:(CLLocationCoordinate2D)coordinate; @end 

viewController.m

 #import "lociseViewController.h" #import "ASIHTTPRequest.h" #import "SBJSON.h" #import "userPins.h" @implementation lociseViewController @synthesize mapView = _mapView; - (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 // Add new method above refreshTapped - (void)plotPositions:(NSString *)responseString { for (id<MKAnnotation> annotation in _mapView.annotations) { [_mapView removeAnnotation:annotation]; } NSDictionary * root = [responseString JSONValue]; NSArray *data = [root objectForKey:@"data"]; for (NSArray * row in data) { NSInteger * fbid = (NSInteger *)[row objectAtIndex:0]; NSNumber * latitude = [row objectAtIndex:1]; NSNumber * longitude = [row objectAtIndex:2]; CLLocationCoordinate2D coordinate; coordinate.latitude = latitude.doubleValue; coordinate.longitude = longitude.doubleValue; userPins *annotation = [[[userPins alloc] initWithfbid:fbid coordinate:coordinate] autorelease]; [_mapView addAnnotation:annotation]; } } // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { // 1 MKCoordinateRegion mapRegion = [_mapView region]; CLLocationCoordinate2D centerLocation = mapRegion.center; // 2 NSString *jsonFile = [[NSBundle mainBundle] pathForResource:@"command" ofType:@"json"]; NSString *formatString = [NSString stringWithContentsOfFile:jsonFile encoding:NSUTF8StringEncoding error:nil]; NSString *json = [NSString stringWithFormat:formatString, centerLocation.latitude, centerLocation.longitude, 0.5*METERS_PER_MILE]; NSURL *url = [NSURL URLWithString:@"http://localhost/users.json"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; request.requestMethod = @"POST"; //request.defaultResponseEncoding = NSISOLatin1StringEncoding; //[request addRequestHeader:@"Content-Encoding" value:@"windows-1255"]; [request addRequestHeader:@"Content-Type" value:@"application/json"]; [request appendPostData:[json dataUsingEncoding:NSUTF8StringEncoding]]; [request setDefaultResponseEncoding:NSUTF8StringEncoding]; // 5 [request setDelegate:self]; [request setCompletionBlock:^{ NSString *responseString = [request responseString]; NSLog(@"Response: %@", responseString); [self plotPositions:responseString]; }]; [request setFailedBlock:^{ NSError *error = [request error]; NSLog(@"Error: %@", error.localizedDescription); }]; // 6 [request startAsynchronous]; //CLLocationManager *locationManager; //locationManager.delegate = self; [super viewDidLoad]; } - (void)viewWillAppear:(BOOL)animated { // 1 CLLocationCoordinate2D zoomLocation; zoomLocation.latitude = 35.333070; zoomLocation.longitude = 33.302875; // 2 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 50*METERS_PER_MILE, 3*METERS_PER_MILE); // 3 MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion]; // 4 [_mapView setRegion:adjustedRegion animated:YES]; } - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView { userPins *myAnnot = (userPins *)annotationView.annotation; [myAnnot setTitle:@"o21"]; NSLog(@"Title: %@", annotationView.annotation.subtitle); } - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { static NSString *identifier = @"userPins"; if ([annotation isKindOfClass:[userPins class]]) { MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; if (annotationView == nil) { annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; } else { annotationView.annotation = annotation; } annotationView.image = [UIImage imageNamed:@"mapMarker-blue.png"]; annotationView.calloutOffset = CGPointMake(0,0); UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; annotationView.rightCalloutAccessoryView = detailButton; annotationView.enabled = YES; annotationView.canShowCallout = YES; return annotationView; } return nil; } - (void)viewDidUnload { [self setMapView:nil]; [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); } - (void)dealloc { [_mapView release]; [super dealloc]; } @end 

viewController.h

 #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #define METERS_PER_MILE 1609.344 @interface lociseViewController : UIViewController <MKMapViewDelegate> { MKMapView *_mapView; } @property (nonatomic, retain) IBOutlet MKMapView *mapView; - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView; @end 

userPins.m中的setTitle:title方法看起来不正确。

setTitle:方法正在查看和设置字幕而不是标题。 title方法返回一个常量string,即使setTitle:设置标题伊娃,注释将返回相同的常量string。

你可以修复这些方法,或者只是将titlesubtitle声明为copy属性,然后@synthesize在userPins.m中(并在dealloc中释放)。 那么你根本不需要这些方法(它们将被自动执行)。

顺便说一句,当你添加注释时,一定要把标题设置为某个东西(甚至是一个空格),否则标注将不会显示,并且不会调用didSelectAnnotationView

一个单独的问题是viewForAnnotation的内存泄漏。 你应该添加一个autorelease你alloc + init的annotationView

关于更新的代码:

在userPins.m中,它仍然返回subtitletitle常量string,从而隐藏已更改的ivars。 将其更改为:

 - (id)initWithfbid:(NSInteger*)fbid coordinate:(CLLocationCoordinate2D)coordinate { if ((self = [super init])) { _fbid = fbid; _coordinate = coordinate; //init the ivars here... _title = @"Something"; _subtitle = @"Anything"; } return self; } /* comment these methods out - (NSString *)subtitle{ return @"Anything"; } - (NSString *)title{ return @"Something"; } */ 

一个新的,不相关的问题是, fbid应该是NSNumber *而不是NSInteger *NSInteger不是一个对象, NSNumber是JSONparsing器最可能给你的东西。