2012-07-23 103 views
0

我正在寫一個IOS程序,我用地圖在地圖上標記了幾個地方。 現在我有dequereusableannotationview代碼,可以正常使用ONE引腳,但與我使用兩個引腳崩潰或嘗試在地圖上標記兩個點。 它只適用於當我註釋掉一個註釋或註釋dequeucode 但問題是......我甚至需要該出隊代碼?因爲我將永遠擁有的大多數插針可能是...... 10 ..?DequeReusableAnnotationView崩潰程序

感謝您

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MKMapView *mv=[[MKMapView alloc]initWithFrame:CGRectZero]; 
    mv.delegate=self; 
    [self setView:mv]; 

    MapAnnotation* ann=[[MapAnnotation alloc]init]; 
    CLLocationCoordinate2D location; 
    location.latitude=(double)51.501468; 
    location.longitude=(double)-0.141596; 
    [ann setCoordinate:location]; 
    [ann setTitle:@"test"]; 
    [ann setTitle:@"plz work"]; 
    [mv addAnnotation:ann]; 
    [ann release]; 

    MapAnnotation* AnnB=[[MapAnnotation alloc]init]; 
    CLLocationCoordinate2D locationB; 
    locationB.latitude=(double)16.4944; 
    locationB.longitude=(double)-151.7364; 
    [AnnB setCoordinate:locationB]; 
    [AnnB setTitle:@"test"]; 
    [AnnB setSubtitle:@"work"]; 

    [mv addAnnotation:AnnB]; 
    [AnnB release]; 
} 

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{ 
    MKPinAnnotationView *pinView=nil; 

    if (annotation!=mapView.userLocation) { 
     static NSString *[email protected]"MYLoction"; 

     pinView=(MKPinAnnotationView *)[mapView 
             dequeueReusableAnnotationViewWithIdentifier:defaultID]; 
     if (pinView=nil) { 
      pinView=[[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:defaultID]autorelease]; 

      pinView.pinColor=MKPinAnnotationColorPurple; 
      pinView.canShowCallout=YES; 
      pinView.animatesDrop=YES; 
     } 
    } 
} 

回答

0

的一個問題是,當你在

if (pinView=nil) { 

測試相等您正在使用的賦值運算符,=,而不是平等的經營者,==。這會導致nil每次都被分配到pinView,因此您將永遠不會重複使用註釋。我很驚訝,編譯器沒有抓住這個。

另外,你實際上並沒有返回任何東西viewForAnnotation:。試試這個:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation: 
    (id<MKAnnotation>)annotation { 
    if(annotation == mapView.userLocation) { 
     return nil; 
    } 

    static NSString *[email protected]"MYLoction"; 

    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView 
     dequeueReusableAnnotationViewWithIdentifier:defaultID]; 

    if (!pinView) { 
     pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
      reuseIdentifier:defaultID] autorelease]; 

     pinView.pinColor=MKPinAnnotationColorPurple; 
     pinView.canShowCallout=YES; 
     pinView.animatesDrop=YES; 
    } 

    return pinView; 
} 
+0

好,謝謝它完美地工作......但一個問題。 你可以做帶標註的.span嗎?我正在接受位置標記所做的藍色脈搏。我相信財產是跨度,但是當我嘗試做ann.span我看不到它。 – 2012-07-23 16:57:04

+0

不,我不知道有任何方法來改變藍色脈衝的半徑 – 2012-07-23 17:59:50

+0

不,我問你是否可以使註釋做一個脈衝以及 – 2012-07-24 00:18:24

0

嘗試這段代碼適當的修改。以下代碼適用於我。

  • (MKAnnotationView *)的MapView:(的MKMapView *)的MapView viewForAnnotation:(ID)註釋{

    靜態的NSString *標識符= @ 「MyLocation」;
    如果([註釋isKindOfClass:[MNMyLocation類]]){

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [atmLocatorMap dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    if (annotationView == nil) { 
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
    } else { 
        annotationView.annotation = annotation; 
    } 
    
    annotationView.enabled = YES; 
    annotationView.canShowCallout = YES; 
    //annotationView.image=[UIImage imageNamed:@"arrest.png"]; 
    
    return annotationView; 
    

    }

    返回零;

} `