2012-04-15 3 views
2

나는 뭔가 이상한, 어쩌면이 사람에게 익숙한 발견 를 그때 그 다음 -removeAnnotation를 사용하여 주석을 제거, KVO 준수를 사용하여 속성을 좌표 수정하는 MKMapView에 간단한 MKPointAnnotation를 추가하고있다 :. 그러나 주석을 삭제 한 후에지도를 이동할 때 주석이 다시 제거 되어도 핀이 다시 발생합니다! MKMapView가 실제로 주석을 제거하지 않은 것처럼 보입니다.MKMapView가 주석을 제대로 지우지 못합니까?

다음 코드 스 니펫을 참조하십시오. 새로운 Xcode iOS 프로젝트에 붙여 넣을 수 있습니다. 단일보기이면 충분합니다. 보기에 MKMapView를 추가 한 다음 시작, 단계, 중지, 3 개의 단추를 클릭하고 적절한 작업에 연결합니다. "userAnnotation"은보기 컨트롤러의 MKPointAnnotation ivar입니다. Stop을 누르면 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

나는 문제가 정확히 무엇인지 잘 모르겠지만, 당신은 가능성이 수동 KVO 알림이 필요하지 않습니다 (예 willChangeValueForKey :/didChangeValueForKey : 그런 당신이 당신이 세터를 (사용하는 경우; userAnnotation.coordinate = ...은 단지 [userAnnotation setCoordinate:...]입니다.

willChange/didChange을 제거하는 시도하고 그 일을 개선되는지 확인

?

+0

와우, 감사합니다. 제시! 작동하는 것 같습니다! 따라서 좌표 속성에 대한 자체 setter가있는 경우에만 KVO 메서드를 사용해야합니다. 아. – bio

+0

@bio 실제로 올바른 형식의 setter (이 경우 setCoordinate :)를 사용하는 경우 수동으로 KVO 메서드를 사용할 필요가 없습니다. ivar을 직접 설정하는 경우에만 알림을 사용해야합니다. 또는 자동 알림을 끄는 경우 –