11

次の方法でマップ ビューから注釈を削除します。

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

バックグラウンドスレッドから注釈プロパティを設定することが上記のエラーの理由であるという他のスレッドを読みました。しかし、私の場合はそうではありません。すべてがメインスレッドで実行されるからです。お知らせ下さい。

4

4 に答える 4

5

わかりました..ついに解決しました!!! 注釈の追加中に提供されたアニメーションが原因だったと思います。アニメーションと連続して追加された注釈がいくつかあり、アニメーションが開始される直前に注釈が削除されたので、リリースされた注釈への参照があった可能性があります (これは私の推測です)。さらに、各 regionDidChangeAnimated 呼び出しで削除と追加のプロセスが行われたため、削除と追加のプロセスが重複する可能性がありました。とにかく、私がそれを解決した方法は、ユーザーがドラッグを完​​了したことを確認するために、すべての regionDidchangeAnimated の 1 秒後にのみ起動されるタイマーを提供したことでした。これにより、不要なアノテーションの追加と削除が回避され、クラッシュを回避できました。時間を割いて私をサポートしてくれたすべての人に感謝します。

于 2012-06-18T12:59:31.187 に答える
1

PFAnnotation クラスで、タイトルとサブタイトルの両方のプロパティをプロトコルと同じように宣言しましたか?

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

于 2012-06-13T10:10:28.050 に答える
1

PFAnnotation に文字列値のセッター getter が実際に正しくない場合:

ここから: http://cocoadevcentral.com/d/learn_objectivec/

セッター:

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

ゲッター:

- (NSString*) caption 
{
    return caption;
}

リリース:

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

また、この方法で座標を提供する方が簡単です: (ios 3.1.3 でも動作します)

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

より(ios 4からのみ)

stationPin.stationPosition = CLLocationCoordinate2DMake([[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]);
于 2012-06-13T10:21:25.097 に答える
1

プロパティ「タイトル」へのオブザーバーの明示的な削除がコード内のどこかで行われているかどうかを確認してください。

于 2012-06-13T12:15:34.733 に答える