2012-10-24 1 views
0

J'ai une mapView sur laquelle les utilisateurs appuient pour laisser tomber une épingle. Il peut y avoir plusieurs broches à la fois, et chaque vue d'annotation a une légende qui pousse une nouvelle vue à la pile quand elle est pressée. Ce que je veux faire est de passer le titre de la vue d'annotation à l'étiquette dans la deuxième vue.MapView avec plusieurs annotations avec légendes, comment passer le titre à la vue suivante

Voici le code où je laisse tomber la broche:

-(void)press:(UILongPressGestureRecognizer *)recognizer 
{ 
    CGPoint touchPoint = [recognizer locationInView:worldView]; 
    CLLocationCoordinate2D touchMapCoordinate = [worldView convertPoint:touchPoint toCoordinateFromView:worldView]; 

    geocoder = [[CLGeocoder alloc]init]; 
    CLLocation *location = [[CLLocation alloc]initWithCoordinate:touchMapCoordinate 
                altitude:CLLocationDistanceMax 
              horizontalAccuracy:kCLLocationAccuracyBest 
              verticalAccuracy:kCLLocationAccuracyBest 
                timestamp:[NSDate date]]; 
    [geocoder reverseGeocodeLocation:location 
       completionHandler:^(NSArray *placemarks, NSError *error) { 
        NSLog(@"reverseGeocoder:completionHandler: called"); 
        if (error) { 
         NSLog(@"Geocoder failed with error: %@", error); 
        } else { 
         CLPlacemark *place = [placemarks objectAtIndex:0]; 
         address = [NSString stringWithFormat:@"%@ %@, %@ %@", [place subThoroughfare], [place thoroughfare], [place locality], [place administrativeArea]]; 

         if (UIGestureRecognizerStateBegan == [recognizer state]) { 
          addressPin = [[MapPoint alloc]initWithCoordinate:touchMapCoordinate 
                     title:address]; 
          [worldView addAnnotation:addressPin]; 
         } 
        } 
       }]; 
} 

Et voici le code où j'appelle la seconde vue:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    PinViewController *pinViewController = [[PinViewController alloc]init]; 
    [self passValues]; 
    [[self navigationController]pushViewController:pinViewController animated:YES]; 
} 

Répondre

1

Vous pouvez remplacer MKAnnotation (par exemple MyLocation) et déclarer dans le fichier MyLocation.h

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface MyLocation : NSObject <MKAnnotation> { 
    NSNumber *identyfier; 
    NSString *_name; 
    NSString *_address; 
    CLLocationCoordinate2D _coordinate; 
} 

@property (copy) NSString *name; 
@property (copy) NSString *address; 
@property (copy) NSNumber *identyfier; 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

- (id)initWithName:(NSString*)name address:(NSString*)address 
    coordinate:(CLLocationCoordinate2D)coordinate identyfier:(NSNumber *) identyfier; 

@end

dans le fichier MyLocation.m:

#import "MyLocation.h" 

@implementation MyLocation 

@synthesize name = _name; 
@synthesize address = _address; 
@synthesize coordinate = _coordinate; 
@synthesize identyfier = _identyfier; 

- (id)initWithName:(NSString*)name address:(NSString*)address 
    coordinate:(CLLocationCoordinate2D)coordinate identyfier:(NSNumber *)identyfier { 
    if ((self = [super init])) { 
     _name = [name copy]; 
     _address = [address copy]; 
     _coordinate = coordinate; 
     _identyfier = identyfier; 
    } 
    return self; 
} 

À votre avis sur la carte lorsque vous déclarez annotation utilisez cette methos:

MyLocation *pin = [[MyLocation alloc] initWithName:place.name address:place.address coordinate:coordinate2D identyfier:some_id]; 

Ainsi, par exemple dans votre délégué carte:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

vous pouvez utiliser:

((MyLocation *)annotation).identyfier 

pour vérifier l'annotation sélectionnée (vous pouvez bien sûr utiliser différentes variables en classe MyLocation)

+0

Il n'y a pas un nombre fini de broches qui seront vers le bas, alors comment puis-je donner la broche un identifiant de NSNumber aléatoire? –

+0

Dans mon exemple, j'utilise sqlite pour créer et afficher des annotations sur la carte. J'ai là id avec "auto increment", donc il n'y a aucun moyen pour certaines broches a le même id. Si vous stockez vos annotations dans un tableau, vous pouvez utiliser l'index de tableau. – edzio27

+0

Donc, ce que j'ai de la difficulté à comprendre, c'est comment je stocke l'adresse géocodée dans la variable d'adresse de la classe MyLocation? Désolé de poser autant de questions, mais je suis très nouveau à ce sujet. –

0

Habituellement, lorsque je dois passer des variables i il suffit de créer une variable globale qui peut ensuite être lue par les deux vues.

Il est le

extern (NSString *) some_variable_name, que vous mettez dans le fichier .h et dans le fichier .m que vous mettez dans le monde (NSString *) some_variable_name;

qui le peut être lu par toutes les vues

Ou le signe + en face de vous variable, qui peut être lu par toutes les vues qui comprend le point de vue (réglage global en haut dans le fichier .m et dans le fichier .h par le comman

quelque chose = [someview that_variable];

Questions connexes