2010-09-16 34 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」。我正在閱讀dequeueReusableAnnotationViewWithIdentifier的Apple文檔,但仍有點困惑。 – Stephen 2010-09-16 14:22:38

+0

您可以使用任何字符串 - 只要確保您使用與創建的ID相同的視圖出列視圖。您還可以使用不同的ID來創建和出列不同類型的註釋視圖(例如,您可以查看地鐵站和公交站點 - 您可以使用不同的ID創建和出列它們,然後爲其設置適當的註釋) – Vladimir 2010-09-16 14:26:30