2012-06-13 21 views
9

Usuwanie adnotacji z mojego widoku mapy w następujący sposób:MKMapView - Usuwanie adnotacji powoduje awarii aplikacji

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

powoduje mój wniosek do zderzenia z następującym wyjątkiem:

*** 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.' 

Adnotacje są dodanej następujący sposób:

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];   


} 

My PFAnnotation.h jest:

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

} 

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


@end 

i mój PFAnnotation.m jest:

@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]; 
} 

Czytałem w innych wątkach, że ustawienie właściwości adnotacji z wątku tła jest powód, dla powyższego błędu. Ale w moim przypadku tak nie jest, ponieważ wszystko jest wykonywane w głównym wątku. Proszę doradź.

+0

proszę podać kod dodający adnotacje. Dzięki! –

+0

@Guntis Treulands Edytowałem pytanie i dodałem kod. Proszę zobaczyć. – DroidHeaven

+0

co się stanie, gdy nie ustawisz nazwa stacji i długość stacji? czy nadal się zawiesza? –

Odpowiedz

4

ok..Odtwórz go w końcu !!! Myślę, że było to spowodowane animacją dostarczoną podczas dodawania adnotacji. ponieważ było kilka adnotacji dodanych z animacją, a adnotacje zostały usunięte tuż przed rozpoczęciem animacji, mogło być odniesienie do opublikowanej adnotacji (to jest moje przypuszczenie). Co więcej, proces usuwania + dodawania został przeprowadzony w każdym regionieDidChangeAnimated call, co mogło spowodować nakładanie się procesu usuwania i dodawania. W każdym razie, jak to rozwiązałem, dostarczyłem zegar, który będzie uruchamiany dopiero po 1 sekundzie po każdym regionieDzwajAnimowany, aby upewnić się, że użytkownik wykonał przeciąganie. W ten sposób uniknięto niepotrzebnego dodawania + usuwania adnotacji i udało mi się uniknąć awarii. Dziękuję wszystkim tutaj za poświęcony mi czas, zwłaszcza Guntis Treulands.

1

W swojej klasie PFAnnotation zadeklarowano właściwości tytułu i podtytułu, które znajdują się w protokole?

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

+0

Dodałem pliki zajęć w pytaniu. Czy są one zgodne z wymaganiami Apple? (Nie jestem ekspertem od oprogramowania, przepraszam). – DroidHeaven

+0

Nie rozumiem, dlaczego tracisz tytuł/podtytuł ... powinieneś po prostu zadeklarować właściwości i zsyntetyzować je; później podczas tworzenia adnotacji wystarczy ustawić je – Valerio

+0

Ponieważ jestem facetem, konserwacji, nie jestem pewien, dlaczego oryginalny deweloper napisał jak ten :). Pozwól, że wypróbuję wybraną trasę. – DroidHeaven

1

Jeśli Twój PFAnnotation naprawdę ma gdzieś ustawiaczy pobierające dla wartości ciągów:

stąd: http://cocoadevcentral.com/d/learn_objectivec/

Seter:

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

Getter:

- (NSString*) caption 
{ 
    return caption; 
} 

Release:

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

także - łatwiej jest zapewnić współrzędne w ten sposób: (działa także na iOS 3.1.3)

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

niż (tylko z iOS 4)

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

tak .. ale wydaje się, że to nie pomoże :(. – DroidHeaven

+1

czy możesz spróbować wprowadzić te pliki mapPin? http://stackoverflow.com/questions/8180513/removing-adding-annotations-to-mapview -nause-memory-leaks/8180605 # 8180605 Mam nadzieję, że to rozwiąże problem –

+0

dzięki :) .. pozwól mi spróbować, że – DroidHeaven

1

Proszę sprawdzić, czy wyraźne usunięcie obserwatora do "tytułu" nieruchomości odbywa się w dowolnym miejscu kodu.

+0

Pozwól mi to sprawdzić. – DroidHeaven

+1

a także spróbuj usuwanie i dodawanie adnotacji mocno w głównym wątku przez jawne wywołanie „performSelectorOnMainthread”. – iosDev

Powiązane problemy