奇妙なことを見つけました。おそらくこれは誰にとってもおなじみです。単純な MKPointAnnotation を MKMapView に追加し、KVO 準拠を使用して座標プロパティを変更し、 -removeAnnotation: を使用して注釈を削除しています。ただし、注釈が削除された後にマップを移動すると、注釈が削除されたはずなのに、ピンが再び発生します! さらに確認すると、MKMapView は実際には注釈を削除していないようです。
次のコード スニペットを参照してください。それを新しい Xcode iOS プロジェクトに貼り付けることができます。単一のビューで十分です。MKMapView をビューに追加してから、3 つのボタン Start、Step、Stop を追加し、それらを適切なアクションに接続します。「userAnnotation」は、View Controller の MKPointAnnotation ivar です。Stop を押すと、MKMapView の注釈の数が、削除の前後にコンソールに出力されます。ARC が有効になっています。
再現方法:
- スタートを押します。ピンが表示されます。
- ステップを押します。ピンが少し動きます。
- 停止を押します。ピンが消える。
- 地図をドラッグ - ピンが再表示されます!
Start を押してから Stop を押すと (Step を押さずに)、注釈が正しく削除されます。コンソールのカウンターを確認してください。1、0 = OK
何が起こっているのか分かりますか?私はKVOのことを正しくやったと思いました。
- (IBAction)startTouched:(id)sender
{
userAnnotation = [[MKPointAnnotation alloc] init];
userAnnotation.coordinate = CLLocationCoordinate2DMake(50.85, 4.72); // some coord
[mapView addAnnotation:userAnnotation];
MKMapPoint p = MKMapPointForCoordinate(userAnnotation.coordinate);
double w = 500 * MKMapPointsPerMeterAtLatitude(userAnnotation.coordinate.latitude);
[mapView setVisibleMapRect:MKMapRectMake(p.x - w, p.y - w, 2*w, 2*w) animated:NO];
}
- (void)nextLocation
{
MKMapPoint p = MKMapPointForCoordinate(userAnnotation.coordinate);
p.x += 10 * MKMapPointsPerMeterAtLatitude(userAnnotation.coordinate.latitude);
[userAnnotation willChangeValueForKey:@"coordinate"];
userAnnotation.coordinate = MKCoordinateForMapPoint(p);
[userAnnotation didChangeValueForKey:@"coordinate"];
NSLog(@"pin at %@, %@", MKStringFromMapPoint(p), [NSThread currentThread]);
}
- (IBAction)stepTouched:(id)sender
{
[self nextLocation];
}
- (IBAction)stopTouched:(id)sender
{
NSLog(@"mark 10, map has %u annotations, %@", [mapView.annotations count], userAnnotation);
[mapView removeAnnotation:userAnnotation];
NSLog(@"mark 20, map has %u annotations, %@", [mapView.annotations count], [NSThread currentThread]);
userAnnotation = nil;
}