2012-06-13 10 views
9

rimozione delle annotazioni dal mio guarda la mappa nel modo seguente:MKMapView - Rimozione annotazione provoca incidente app

if ([[self.mapView annotations] count] > 0) 
{ 
    [self.mapView removeAnnotations:[self.mapView annotations]]; 
} 

provoca la mia domanda di crash con la seguente eccezione:

*** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <MKAnnotationContainerView 0xe87b420> for the key path "title" from <PFAnnotation 0x10851230> because it is not registered as an observer.' 

Le annotazioni vengono aggiunti in nel seguente modo:

CLLocationCoordinate2D pinPosition; 
for (int index = 0; index < [array count]; index++) 
{   
    Station *aStation = [array objectAtIndex:index]; 
    PFAnnotation *stationPin = [[PFAnnotation alloc] init]; //StationPinView 
    pinPosition = CLLocationCoordinate2DMake([[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]); 
    stationPin.stationName = [aStation valueForKey:@"stationName"]; 
    stationPin.stationPosition = pinPosition; 
    stationPin.stationLength = [aStation valueForKey:@"platformLength"]; 

    [self.mapView addAnnotation:stationPin]; 
    [stationPin release];   


} 

mio PFAnnotation.h è:

@interface PFAnnotation : NSObject <MKAnnotation> 
{ 
    NSString *stationName; 
    CLLocationCoordinate2D stationPosition; 
    NSNumber *stationLength; 

} 

@property (nonatomic, retain) NSString *stationName; 
@property CLLocationCoordinate2D stationPosition; 
@property (nonatomic, retain) NSNumber *stationLength; 


@end 

e la mia PFAnnotation.m è:

@implementation PFAnnotation 

@synthesize stationName; 
@synthesize stationPosition; 
@synthesize stationLength; 


- (CLLocationCoordinate2D)coordinate; 
{ 
    return stationPosition; 
} 

- (NSString *)title 
{ 
    return stationName; 

} 

- (NSString *)subtitle 
{ 
    if (stationLength == nil) 
     return nil; 
    else 
     return [NSString stringWithFormat:@"Platform Length: %@ft",stationLength]; 
} 


- (void)dealloc { 
    [stationName release]; 
    [stationLength release]; 
    [super dealloc]; 
} 

Ho letto in alcuni altri fili che, l'impostazione delle proprietà delle annotazioni dal thread in background è la ragione per l'errore precedente. Ma nel mio caso, non è così perché ogni cosa viene eseguita sul thread principale. Si prega di avvisare.

+0

per favore aggiungi del codice come aggiungi le annotazioni in primo luogo.! Grazie! –

+0

@Guntis Treulands Ho modificato la domanda e aggiunto il codice. Perfavore guarda. – DroidHeaven

+0

cosa succede quando non si imposta stationName e stationLength? si schianta ancora? –

risposta

4

ok..assolutamente finalmente !!! Penso che sia dovuto all'animazione fornita durante l'aggiunta di annotazioni. poiché c'erano un numero di annotazioni che sono state aggiunte con l'animazione e anche le annotazioni sono state rimosse poco prima dell'inizio dell'animazione, potrebbe esserci stato un riferimento all'annotazione rilasciata (questa è la mia ipotesi). Inoltre, il processo di rimozione + aggiunta è stato effettuato su ciascuna regioneDidChangeAnimata chiamata, che avrebbe potuto creare una sovrapposizione tra il processo di rimozione e quello di aggiunta. Ad ogni modo, come ho risolto il problema, ho fornito un timer che verrà attivato solo dopo 1 secondo dopo ogni regionDidchangeAnimated per assicurarsi che l'utente abbia terminato il trascinamento. Quindi è stata evitata aggiunta superflua + rimozione di annotazioni e sono stato in grado di evitare l'incidente. Grazie a tutti i ragazzi qui per il loro tempo dedicato a supportarmi, specialmente Guntis Treulands.

1

Nella classe PFAnnotation, hai dichiarato le proprietà di titolo e sottotitoli come nel protocollo?

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKAnnotation_Protocol/Reference/Reference.html

+0

Ho aggiunto i file di classe nella domanda. Sono conformi ai requisiti di Apple? (Non sono uno sviluppatore esperto, scusami). – DroidHeaven

+0

Non capisco perché stai ignorando il getter del titolo/sottotitolo ... dovresti solo dichiarare le proprietà e sintetizzarle; in seguito, quando crei l'annotazione, li imposti semplicemente – Valerio

+0

Dato che sono il manutentore, non sono sicuro del motivo per cui lo sviluppatore originale ha scritto così :). Fammi provare la rotta che hai specificato. – DroidHeaven

1

se il vostro PFAnnotation ha davvero setter non corrette getter per valori di stringa:

da qui: http://cocoadevcentral.com/d/learn_objectivec/

Setter:

- (void) setCaption: (NSString*)input 
{ 
    [caption autorelease]; 
    caption = [input retain]; 
} 

Getter:

- (NSString*) caption 
{ 
    return caption; 
} 

rilascio:

- (void) dealloc 
{ 
    [caption release]; 
    [super dealloc]; 
} 

anche - è più facile per fornire le coordinate in questo modo: (funziona anche su iOS 3.1.3)

stationPin.stationPosition = (CLLocationCoordinate2D) {[[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]} 

di (solo da iOS 4)

stationPin.stationPosition = CLLocationCoordinate2DMake([[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]); 
+0

sì..ma sembra che non sia d'aiuto neanche :(. – DroidHeaven

+1

puoi provare a implementare questi file di classe mapPin? http://stackoverflow.com/questions/8180513/removing-adding-annotations-to-mapview -cause-memory-leaks/8180605 # 8180605 speriamo che risolverà il problema –

+0

grazie :) .. fammi provare quello – DroidHeaven

1

Si prega di verificare se una rimozione esplicita dell'osservatore alla proprietà "titolo" viene eseguita ovunque nel codice.

+0

lasciami controllare. – DroidHeaven

+1

e, per favore, prova a rimuovere e aggiungere annotazioni forzatamente nel thread principale chiamando esplicitamente "performSelectorOnMainthread". – iosDev

Problemi correlati