2010-11-26 5 views
0

Ich versuche, alle Anmerkungen einer Map zu entfernen. Die Klasse, die die MKMapView enthält, implementiert die MKMapViewDelegate. Ich rufe die Methode zum Entfernen aller Annotationen auf, wenn auf eine Schaltfläche (in einer modalen Ansicht angezeigt) geklickt wird. Ich verwende den nächsten Code, um alle Anmerkungen zu entfernen.Probleme beim Entfernen von Anmerkungen aus einer MKMapView

- (void)removeAllAnnotations { 

NSMutableArray *annotationsToRemove = [NSMutableArray arrayWithCapacity:[self.mapView.annotations count]]; 
for (int i = 0; i < [self.mapView.annotations count]; i++) { 
    if ([[self.mapView.annotations objectAtIndex:i] isKindOfClass:[AddressAnnotation class]]) { 
    [annotationsToRemove addObject:[self.mapView.annotations objectAtIndex:i]]; 
    } 
} 

[self.mapView removeAnnotations:annotationsToRemove]; 
} 

Der Code funktioniert richtig, aber nach dem Aufruf der Methode, und wenn ich versuche, neue Anmerkungen auf die leere Karte hinzuzufügen, wird die Klasse nicht auf die viewForAnnotations Methode aufrufen und die Anmerkungen nicht fallen nach unten und nicht zeigen eine Schaltfläche zum Anzeigen in der Anmerkungsansicht. Warum passiert dies?

Danke fürs Lesen.

Edited:

Die Annotationen gezeigt sind, aber mit aus der Ansicht für Annotations-Methode aufgerufen (mit heraus fallen nach unten und mit aus, die eine Offenbarung Taste in die Anmerkungsansicht). Hier ist die Methode, die ich verwende, um die Annotationen und die viewForAnnotation Methode hinzuzufügen.

- (void)loadAnnotations:(NSString *)type { 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"PlacesInformation" ofType:@"plist"]; 
    NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; 

    for (int i = 0; i < tmpArray.count; i++) { 

     // Breaks the string down even further to latitude and longitude fields. 
     NSString *coordinateString = [[tmpArray objectAtIndex:i] objectForKey:@"coordinates"]; 

     NSString *option = [[tmpArray objectAtIndex:i] objectForKey:@"type"];    
     if ([option isEqualToString:type]) { 
      CLLocationCoordinate2D currentCoordinate = [self stringToCoordinate:coordinateString]; 
      AddressAnnotation *annotation = [[[AddressAnnotation alloc] initWithCoordinate:currentCoordinate] autorelease]; 
      [self.mapView addAnnotation:annotation]; 
     } 
    } 
} 

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 

    // If it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 
    else { // Handles the other annotations. 
     // Try to dequeue an existing pin view first. 
     static NSString *AnnotationIdentifier = @"AnnotationIdentifier"; 
     MKPinAnnotationView *pinView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

     if (!pinView) { 
      // If an existing pin view was not available, creates one. 
      MKPinAnnotationView *customPinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; 
      customPinView.animatesDrop = YES; 
      customPinView.canShowCallout = YES; 

      // Adds a detail disclosure button. 
      UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
      customPinView.rightCalloutAccessoryView = rightButton; 

      return customPinView; 
     } else 
      pinView.annotation = annotation; 
    } 

    return nil; 
} 
+1

den Code So zeigen Sie uns, die uns den Code funktioniert und zeigen nicht, dass nicht der Fall ist? –

+0

Zeigen Sie, wie Sie die neuen Anmerkungen hinzufügen. Werden die neuen Anmerkungen auf der Karte angezeigt? – Anna

Antwort

0

Wenn Sie in ViewForAnnotation eine Ansicht wiederverwenden, geben Sie gerade Nil zurück.

Dieser sonst Teil:

} else 
    pinView.annotation = annotation; 

Sollte wahrscheinlich:

} else { 
    pinView.annotation = annotation; 
    return pinView; 
} 
+0

Ich versichere Ihnen, dass ich es millionenfach überarbeitet habe. Das war das Problem. Vielen Dank aBitObvious. –

+0

Ich arbeite an Mapview Projekt. Ich habe eine Frage zum Entfernen von Annotationen aus der mapView. Ich habe den folgenden Code implementiert, aber es entfernt Annotation nach dem Zufallsprinzip, nicht die erste! [mapView removeAnnotation: [self.mapView.annotations objectAtIndex: 0]]; –