我发现了一些奇怪的东西,也许这对任何人都很熟悉: 我正在向MKMapView添加一个简单的MKPointAnnotation,然后使用KVO-compliance修改其坐标属性,然后使用-removeAnnotation:删除注释。但是,在注释被删除后,当我移动地图时,即使注释被删除,引脚也会再次出现!进一步检查,它看起来像MKMapView并没有真正删除注释。MKMapView没有正确删除注释?
请参阅以下代码片段。你可以将它粘贴到一个新的Xcode iOS项目中,单个视图就足够了。将MKMapView添加到视图中,然后3个按钮开始,步骤,停止并将它们连接到适当的操作。 “userAnnotation”是视图控制器中的MKPointAnnotation ivar。 如果按下停止键,MKMapView的注释数量将在移除前后打印到控制台。 ARC已启用。
如何重现:
- 按下启动;出现一个别针。
- 按步骤;该引脚移动了一下。
- 按停止;该引脚消失。
- 拖动地图 - 该针再次出现!
如果你按下开始,然后停止(不按下步骤),注释被正确删除,检查控制台中的计数器: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;
}
哇,谢谢杰西!它似乎工作!所以我们只有在我们拥有自己的坐标属性的setter时才需要使用KVO方法。 AHHHHH。 – bio 2012-04-19 15:55:37
@bio其实,如果你使用了正确形式的setter(setCoordinate:在这种情况下),你不需要手动使用KVO方法。只有当你直接设置伊娃,你需要使用通知。 (或者如果您关闭自动通知。) – 2012-04-23 00:40:47