MKMapView没有正确删除注释?

时间:2012-04-15 19:23:14

标签: ios annotations mkmapview key-value-observing coordinate

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

请参阅以下代码段。您可以将其粘贴到新的Xcode iOS项目中,单个视图就足够了。将MKMapView添加到视图中,然后按3开始,步骤,停止按钮,并将它们连接到相应的操作。 “userAnnotation”是视图控制器中的MKPointAnnotation ivar。 如果按“停止”,则在删除之前和之后,MKMapView的注释数将打印到控制台。 ARC已启用。

如何重现:

  1. 按开始;一个别针出现了。
  2. 按Step;引脚移动了一下。
  3. 按停止;针就消失了。
  4. 拖动地图 - 引脚重新出现!
  5. 如果按开始然后按停止(不按步骤),则正确删除注释,检查控制台中的计数器: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;
    }
    

1 个答案:

答案 0 :(得分:3)

我不确定问题究竟是什么,但你可能不需要手动KVO通知(即willChangeValueForKey:/ didChangeValueForKey :),如果你使用的是setter(你是{{​​1}}只是userAnnotation.coordinate = ...)。

尝试删除willChange / didChange并查看是否可以改善效果?