나는 뭔가 이상한, 어쩌면이 사람에게 익숙한 발견 를 그때 그 다음 -removeAnnotation를 사용하여 주석을 제거, KVO 준수를 사용하여 속성을 좌표 수정하는 MKMapView에 간단한 MKPointAnnotation를 추가하고있다 :. 그러나 주석을 삭제 한 후에지도를 이동할 때 주석이 다시 제거 되어도 핀이 다시 발생합니다! MKMapView가 실제로 주석을 제거하지 않은 것처럼 보입니다.MKMapView가 주석을 제대로 지우지 못합니까?
다음 코드 스 니펫을 참조하십시오. 새로운 Xcode iOS 프로젝트에 붙여 넣을 수 있습니다. 단일보기이면 충분합니다. 보기에 MKMapView를 추가 한 다음 시작, 단계, 중지, 3 개의 단추를 클릭하고 적절한 작업에 연결합니다. "userAnnotation"은보기 컨트롤러의 MKPointAnnotation ivar입니다. Stop을 누르면 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 메서드를 사용해야합니다. 아. – bio
@bio 실제로 올바른 형식의 setter (이 경우 setCoordinate :)를 사용하는 경우 수동으로 KVO 메서드를 사용할 필요가 없습니다. ivar을 직접 설정하는 경우에만 알림을 사용해야합니다. 또는 자동 알림을 끄는 경우 –