2

我发现了一些奇怪的东西,也许这对任何人来说都很熟悉:我正在向 MKMapView 添加一个简单的 MKPointAnnotation,然后使用 KVO-compliance 修改其坐标属性,然后使用 -removeAnnotation: 删除注释。然而,当我在注释被删除后移动地图时,图钉再次出现——即使注释被删除了!进一步检查,看起来 MKMapView 并没有真正删除注释。

请参阅以下代码片段。您可以将它粘贴到一个新的 Xcode iOS 项目中,单个视图就足够了。将 MKMapView 添加到视图,然后添加 3 个按钮 Start、Step、Stop,并将它们连接到适当的操作。“userAnnotation”是视图控制器中的 MKPointAnnotation ivar。如果按停止,则 MKMapView 的注释数量会在删除前后打印到控制台。ARC 已启用。

如何重现:

  1. 按开始; 出现一个图钉。
  2. 按步;销移动了一点。
  3. 按停止;销消失。
  4. 拖动地图 - 大头针重新出现!

如果按 Start 然后 Stop(不是按 Step),注释被正确删除,检查控制台中的计数器:1, 1 =奇怪;1, 0 = 好的

知道发生了什么吗?我以为我正确地做了 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 = ...我不确定到底是什么问题,但是如果您使用的是 setter(您就是;只是) ,您可能不需要像这样的手动 KVO 通知(即 willChangeValueForKey:/didChangeValueForKey:) [userAnnotation setCoordinate:...]

尝试删除 willChange/didChange 看看是否会有所改善?

于 2012-04-15T21:22:24.343 回答