2010-09-16 2 views
0

Я пытаюсь отметить начальный вывод и конечный вывод на моей карте разными цветами. Возможно, стартовый штырь в зеленом и конечный вывод красного цвета.Раскраски на карте

Мой код ниже, читает координаты широты/долготы из основных данных и циклов вокруг размещения красного штыря для каждого объекта, найденного в основных данных.

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]; 
    } 
} 

Из того, что я прочитал и некоторые примеры, которые я нашел, когда прибегая к помощи следующего кода вызывается для каждого вывода на карте. Его не помещают зеленые контакты на моей карте. Возможно, мне нужно передать координаты этому методу и позволить ему помещать вывод на карту вместо кода выше.

- (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; 
} 

Любая помощь или толчок в правильном направлении (извините за каламбур) очень ценится.

С уважением, Стивеном

ответ

0
MKPinAnnotationView *annView = nil; 
... 

Вы не создаете вид аннотаций здесь, просто работать с нулевым объектом (который работает хорошо, но ничего не делает) и возвращать ноль - так естественно, шпилька не отображается (как это делает не существует).

Правильный метод будет выглядеть следующим образом:

- (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; 
} 

Здесь вы пытаетесь повторно использовать вид аннотаций, если это возможно (аналогично, как вы делаете с ячейками в виде таблицы), создать и настроить новый один, если не

+0

Владимир, Спасибо за ответ. Я просто немного смущен, как то, что должно быть вместо @ «SomeID». Я читаю документацию Apple для dequeueReusableAnnotationViewWithIdentifier, но все еще немного запутался. – Stephen

+0

Вы можете использовать любую строку для этого - просто убедитесь, что вы удалили представление с тем же идентификатором, который был создан. Вы также можете использовать разные идентификаторы для создания и удаления различных видов аннотаций (например, у вас есть представления для станций метро и остановок на автобусах - вы можете создавать и деактивировать их с помощью разных идентификаторов, а затем просто устанавливать для них соответствующую аннотацию) – Vladimir

Смежные вопросы