2012-07-23 102 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; 
    

    }

    返回零;

} `