2011-10-04 65 views
1

我已经搜索,但我没有找到任何解决方案,我的问题。我想改变已经添加的引脚。这是我的代码。我在控制台中看到“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.m我有。但我并没有用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. 
    // e.g. 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 

回答

2

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

setTitle:方法正在查看和设置字幕而不是标题。 title方法返回一个常量字符串,所以即使setTitle:设置了标题ivar,该注释也会返回相同的常量字符串。

你能解决这些方法或只是声明titlesubtitlecopy性能和@synthesize他们userPins.m(和释放的dealloc)。那么你根本不需要这些方法(它们将自动实现)。

顺便说一下,当您添加注释时,一定要将标题设置为某个内容(即使是单个空格),否则标注将不会显示,并且不会调用didSelectAnnotationView

单独的问题是viewForAnnotation中的内存泄漏。你应该添加一个autorelease你分配的地方+ init annotationView


关于更新的代码:

在userPins.m,它仍然会返回常量字符串为subtitletitle这样就隐藏了改变高德。将其更改为:

- (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是JSON解析器最可能给你的东西。

+0

你真了不起!非常感谢@AnnaKarenina – Okan

+0

但是我在这里有另一个问题:(标注泡泡显示不正确。像这样[link](http://i56.tinypic.com/35arhxs.png)@AnnaKarenina – Okan

+0

它可能是ASIHTTPRequest试图在选择注释的同时从背景更新地图视图也许你可以尝试首先将注解对象集合到一个数组中,而不是为每个注释对象调用addAnnotation(单数),然后调用addAnnotations(复数)循环并将其传递给数组。 – Anna