2012-06-13 2 views
9

Удаление аннотаций с моей точки зрения карты следующим образом:MKMapView - Удаление аннотаций вызывает сбой приложения

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

вызывает мое приложение к сбою за исключением следующего:

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

Аннотации добавляются в следующим образом:

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


} 

Мои 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 

и мой 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]; 
} 

Я прочитал в некоторых других потоках, что, устанавливая свойство аннотаций из фонового потока является причиной выше ошибки. Но в моем случае это не так, потому что каждая вещь выполняется в основном потоке. Пожалуйста, порекомендуйте.

+0

, пожалуйста, добавьте код, как вы добавляете аннотации в первую очередь.! Благодаря! –

+0

@Guntis Treulands Я отредактировал вопрос и добавил код. Пожалуйста, посмотри. – DroidHeaven

+0

Что произойдет, если вы не установили имя станции и номер станции? он все еще падает? –

ответ

4

ok..разработано это наконец !!! Я думаю, что это было связано с анимацией, предоставленной во время добавления аннотаций. поскольку было добавлено несколько аннотаций, которые были добавлены спина к спине с анимацией, а также аннотации были удалены непосредственно перед началом анимации, возможно, была ссылка на выпущенную аннотацию (это моя догадка). Кроме того, процесс удаления + добавления был выполнен на каждом регистре, который мог бы сделать перекрытие между процессом удаления и добавления. Во всяком случае, как я решил, это было то, что я предоставил таймер, который будет запущен только через 1 секунду после каждого regionDidchangeAnimated, чтобы убедиться, что пользователь выполнил перетаскивание. Таким образом, было исключено ненужное добавление + удаление аннотаций, и я смог избежать краха. Спасибо всем парням за это время, чтобы поддержать меня, особенно Гунтис Треландс.

1

В вашем классе PFAnnotation вы объявили свойства заголовка и субтитров, как они есть в протоколе?

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

+0

Я добавил файлы классов в вопрос. Соответствуют ли они требованиям Apple? (Я не эксперт-разработчик, прошу прощения). – DroidHeaven

+0

Я не понимаю, почему вы переопределяете получателя заголовка/субтитров ... вы должны просто объявить свойства и синтезировать их; позже, когда вы создаете аннотацию, просто установите их. – Valerio

+0

Так как я обслуживающий парень, я не уверен, почему оригинальный разработчик написал вот так :). Позвольте мне попробовать маршрут, который вы указали. – DroidHeaven

1

Если Ваш PFAnnotation действительно имеет неправильные сеттеры геттеров для строковых значений:

здесь: http://cocoadevcentral.com/d/learn_objectivec/

сеттер:

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

Getter:

- (NSString*) caption 
{ 
    return caption; 
} 

выпуска:

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

также - это проще обеспечить координаты в этом случае: (также работает на КСН 3.1.3)

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

чем (только от КСН 4)

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

yeah..but похоже, что это не поможет :(. – DroidHeaven

+1

Вы можете попробовать реализовать эти файлы класса mapPin? http://stackoverflow.com/questions/8180513/removing-adding-annotations-to-mapview -cause-memory-leaks/8180605 # 8180605 надеюсь, что это исправит проблему. –

+0

спасибо :) .. позвольте мне попробовать, что – DroidHeaven

1

Пожалуйста, проверьте, выполняется ли явное удаление наблюдателя в свойство «title» в любом месте кода.

+0

Позвольте мне проверить это. – DroidHeaven

+1

, а также попробуйте удалить и добавить аннотацию в основном потоке, явно называя «performSelectorOnMainthread». – iosDev

Смежные вопросы