2012-04-15 111 views
2

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

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

如何重现:

  1. 按下启动;出现一个别针。
  2. 按步骤;该引脚移动了一下。
  3. 按停止;该引脚消失。
  4. 拖动地图 - 该针再次出现!

如果你按下开始,然后停止(不按下步骤),注释被正确删除,检查控制台中的计数器:1,1 =怪异; 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; 
} 

回答

3

我不知道到底是什么问题,但你可能并不需要手动志愿通知(即willChangeValueForKey:/ didChangeValueForKey :)一样,如果你使用一个setter(你是; userAnnotation.coordinate = ...只是[userAnnotation setCoordinate:...])。

尝试删除willChange/didChange,看看是否改善了事情?

+0

哇,谢谢杰西!它似乎工作!所以我们只有在我们拥有自己的坐标属性的setter时才需要使用KVO方法。 AHHHHH。 – bio 2012-04-19 15:55:37

+0

@bio其实,如果你使用了正确形式的setter(setCoordinate:在这种情况下),你不需要手动使用KVO方法。只有当你直接设置伊娃,你需要使用通知。 (或者如果您关闭自动通知。) – 2012-04-23 00:40:47