Заголовок выноски аннотации не изменяется - PullRequest
1 голос
/ 04 октября 2011

Я искал, но не нашел решения своей проблемы.Я хочу изменить уже добавленный пин-код.А вот и мой код.Я получаю «Код здесь» в консоли.

У меня есть .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.
    // 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

1 Ответ

2 голосов
/ 04 октября 2011

Методы setTitle: и title в userPins.m выглядят неправильно.

Метод setTitle: ищет и устанавливает субтитры вместо заголовка.Метод title возвращает постоянную строку, поэтому, даже если setTitle: устанавливает заголовок ivar, аннотация будет возвращать ту же самую постоянную строку.

Вы можете исправить эти методы или просто объявить title и subtitleкак copy свойства и @synthesize их в userPins.m (и выпуск в dealloc).Тогда вам вообще не нужны эти методы (они будут реализованы автоматически).

Кстати, когда вы добавляете аннотацию, обязательно установите заголовок на что-то (даже один пробел), иначеВызов не будет отображаться, и didSelectAnnotationView не будет вызван.

Отдельная проблема - утечка памяти в viewForAnnotation.Вы должны добавить autorelease, где вы выделяете + init annotationView.


Относительно обновленного кода:

В userPins.m он по-прежнему возвращаетконстанты для subtitle и title, скрывающие измененные ивары.Измените его на:

- (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-анализатор, скорее всего, дает вам.

...