2012-04-15 116 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