2

奇妙なことを見つけました。おそらくこれは誰にとってもおなじみです。単純な MKPointAnnotation を MKMapView に追加し、KVO 準拠を使用して座標プロパティを変更し、 -removeAnnotation: を使用して注釈を削除しています。ただし、注釈が削除された後にマップを移動すると、注釈が削除されたはずなのに、ピンが再び発生します! さらに確認すると、MKMapView は実際には注釈を削除していないようです。

次のコード スニペットを参照してください。それを新しい Xcode iOS プロジェクトに貼り付けることができます。単一のビューで十分です。MKMapView をビューに追加してから、3 つのボタン Start、Step、Stop を追加し、それらを適切なアクションに接続します。「userAnnotation」は、View Controller の MKPointAnnotation ivar です。Stop を押すと、MKMapView の注釈の数が、削除の前後にコンソールに出力されます。ARC が有効になっています。

再現方法:

  1. スタートを押します。ピンが表示されます。
  2. ステップを押します。ピンが少し動きます。
  3. 停止を押します。ピンが消える。
  4. 地図をドラッグ - ピンが再表示されます!

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

1 に答える 1

3

問題が何であるか正確にはわかりませんが、セッターを使用している場合(あなたがいる;userAnnotation.coordinate = ...はちょうどです[userAnnotation setCoordinate:...])のような手動のKVO通知(つまり、willChangeValueForKey:/didChangeValueForKey:)は必要ないでしょう。

willChange/didChange を削除してみて、改善されるかどうかを確認してください。

于 2012-04-15T21:22:24.343 に答える