2010-09-16 9 views
0

J'essaie de marquer une épingle de départ et une épingle de fin sur ma carte avec des couleurs différentes. Peut-être la broche de départ en vert et la broche de finition en rouge.Colorier les épingles sur une carte

Mon code ci-dessous, lit les coordonnées de latitude/longitude à partir des données de base et des boucles autour de placer une épingle rouge pour chaque objet trouvé dans les données de base.

MapPin.h

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

@interface MapPin : NSObject <MKAnnotation>{ 

    CLLocationCoordinate2D coordinate; 
} 

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

-(id)initwithCoordinates:(CLLocationCoordinate2D)location; 

@end 

MapPin.m

#import "MapPin.h" 


@implementation MapPin 

@synthesize coordinate; 

-(id)initwithCoordinates:(CLLocationCoordinate2D)location 
{ 
    self = [super init]; 
    if (self != nil) { 
     coordinate = location; 
    } 
    return self; 
} 

-(void)dealloc{ 
[super dealloc]; 
} 
@end 

MapViewController.m

-(void)addAnnotations 
{ 
    if (![sharedMapID isEqualToString:@""]){ 
     NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

     NSEntityDescription *entity = [NSEntityDescription entityForName:@"WayPoint" inManagedObjectContext:managedObjectContext]; 
     [request setEntity:entity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"waypoint_map_id contains[cd] %@", sharedMapID]; 
     [request setPredicate:predicate]; 

     NSError *error = nil; 
     NSArray *results = [managedObjectContext executeFetchRequest:request error:&error]; 

     // Check for errors from the FetchRequest 
     if (nil == results || nil != error) 
      NSLog(@"Error getting results : %@", error); 

     listArray = [results mutableCopy]; 
     [request release]; 

     // Loop through the array, get the coordinates and display on the map. 
     for (int i = 0; i < [listArray count]; i++) 
     {  
      NSString *strXCoordinate = [[listArray objectAtIndex: i] valueForKey:@"waypoint_x"]; 
      NSString *strYCoordinate = [[listArray objectAtIndex: i] valueForKey:@"waypoint_y"]; 

      double dblXCoordinate = [strXCoordinate doubleValue]; 
      double dblYCoordinate = [strYCoordinate doubleValue]; 

      CLLocationCoordinate2D coordinate = {dblYCoordinate, dblXCoordinate}; 
      MapPin *pin = [[MapPin alloc]initwithCoordinates:coordinate]; 
      [self.mapView addAnnotation:pin]; 
      [pin release]; 
     } 

     [listArray release]; 
    } 
} 

D'après ce que j'ai lu et quelques exemples que je trouve quand googler le code suivant est appelé pour chaque broche sur la carte. Ce n'est pas placer des épingles vertes sur ma carte. Peut-être que je devrais passer des coordonnées à cette méthode et lui permettre de placer l'épingle sur la carte au lieu du code ci-dessus.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
    { 
     MKPinAnnotationView *annView = nil; 
     annView.pinColor = MKPinAnnotationColorGreen; 
     annView.animatesDrop = TRUE; 
     annView.canShowCallout = YES; 
     annView.calloutOffset = CGPointMake(-5, 5); 
     return annView; 
} 

Toute aide ou poussée dans la bonne direction (excusez le jeu de mots) est très appréciée.

Cordialement, Stephen

Répondre

0
MKPinAnnotationView *annView = nil; 
... 

Vous ne créez pas la vue d'annotation ici, juste fonctionner avec un objet nul (qui fonctionne bien, mais ne fait rien) et retour nul - si naturellement broche est affiche pas (comme il le fait n'existe pas).

méthode correcte ressemblera:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *annView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"SomeID"]; 
    if (!annView){ 
     annView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"SomeID"] autorelease]; 
     annView.pinColor = MKPinAnnotationColorGreen; 
     annView.animatesDrop = TRUE; 
     annView.canShowCallout = YES; 
     annView.calloutOffset = CGPointMake(-5, 5); 
    } 
    annView.annotation = annotation; 
    return annView; 
} 

vous essayez ici de réutiliser vue d'annotation si possible (la même manière que vous faites avec des cellules en vue de la table), créez et la configuration nouvelle, sinon

+0

Vladimir, Merci pour la réponse. Je suis juste un peu confus que ce qui devrait être à la place de @ "SomeID". Je lis la documentation d'Apple pour dequeueReusableAnnotationViewWithIdentifier mais toujours un peu confus. – Stephen

+0

Vous pouvez utiliser n'importe quelle chaîne pour cela - assurez-vous juste de défaire la vue avec le même identifiant que celui qui a été créé. Vous pouvez également utiliser différents ID pour créer et supprimer différents types de vues d'annotations (par exemple vous avez des vues pour les stations de métro et les arrêts de bus). Vous pouvez les créer et les supprimer avec des ID différents, puis leur attribuer une annotation appropriée. – Vladimir