我發現了一些奇怪的東西,也許這對任何人都很熟悉: 我正在向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