Работая с платформой MapKit, я хочу удалить (пользовательскую) аннотацию, используя кнопку («удалить») в соответствующем calloutView.При нажатии кнопки ошибка появляется в разделе отладки XCode:
*** Ошибка подтверждения в - [NSButton lockFocus], /SourceCache/AppKit/AppKit-1348.17/AppKit.subproj/NSView.m:7629
Трассировка: 0 CoreFoundation 0x00007fff8347203c __exceptionPreprocess + 172 1 libobjc.A.dylib 0x00007fff84d6976e objc_exception_throw + 43 2 ядро Corefoundation 0x00007fff 034: перегородка: file: lineNumber: description:] + 195 4 AppKit 0x00007fff8de035c6 - [NSView lockFocus] + 233 5 AppKit 0x00007fff8df8b164 - [NSControl mouseDown:] + 200
Вполне логично, что calloutView нельзя удалить, когда он естьвсе еще показано, поэтому я реализовал следующую процедуру:
В IBAction кнопки аннотация помечается для удаления, затем аннотация устанавливается для отмены выбора
В делегате didDeselect ..вид карты, фактическое удалениепроисходит
-(IBAction)trash:(id)sender {
NSLog(@"put to trash");
MyPointAnnotation *thisAnnotation = (MyPointAnnotation*)[relatedAnnotationView annotation];
[thisAnnotation setFlaggedForDeletion:YES]; // deletion is managed in delegate didDeselect
[thisAnnotation.pointMetadata->mapView deselectAnnotation:thisAnnotation animated:NO];
}
-(void) mapView:(MKMapView *)theMapView didDeselectAnnotationView:(nonnull MKAnnotationView *)view {
if (customCalloutView) {
[customCalloutView removeFromSuperview];
}
if([(MyPointAnnotation*)[view annotation] flaggedForDeletion]){
[view removeFromSuperview];
[theMapView removeAnnotation:[view annotation]];
}
}
Я не ожидаю никаких предупреждений / ошибок, потому что я не удаляю аннотацию во время нажатия кнопки.