在我的macOS应用程序中,我想在MKMapView中实现以下行为:
鉴于我有一个带有多个注释的mapView 当用户单击注释时 然后选择注释 并且取消选择先前选择的注释
鉴于我有一个带有多个注释的mapView 当用户单击持有cmd键的注释时 然后将注释添加到当前选择
鉴于我有一个带有多个注释的mapView 并且至少选择了一个注释 当用户单击包含cmd键的选定注释时 然后从当前选择中删除注释
我保留了一个单独的选定注释数组,因为MKMapView确实有一个selectedAnnotations属性,但是一次只包含一个注释。 第一个场景很容易实现,在mapDelegate中你可以调用didSelect方法。在这个方法中,我可以将注释添加到我选择的注释数组中。
但情景2和3似乎是不可能的。我尝试了以下路线:
一个。使用代表' didSelect和didDeselect方法,但问题是第二次单击(甚至不考虑键修饰符)不会导致didSelect方法的第二次调用,因为此时注释已经被选中。
B中。对MKAnnotationView进行子类化并覆盖以下内容以接管对mapView的控制,但这会导致不显示标注,或者在单击的注释旁边的注释上显示标注等。
override func hitTest(_ point: NSPoint) -> NSView? {
guard let _ = mapView else {
return nil
}
let lPoint = convert(point, from: superview)
if bounds.contains(lPoint) {
// Take our own control
return self
}
else {
// Leave to our superview (the mapView
return nil
}
}
override func mouseUp(with event: NSEvent) {
NSLog("MouseDown on \(self.annotation?.title)")
guard let lGeocache = annotation as? Geocache, let lMapView = mapView else {
return
}
let lCacheAC = TGAppDelegate.shared().cacheArrayController
if inSelectionSet {
lCacheAC.removeSelectedObjects([lGeocache])
}
else {
lCacheAC.addSelectedObjects([lGeocache])
}
// Show the callout
lMapView.selectAnnotation(self.annotation!, animated: true)
}
℃。你不应该继承MKMapView,但我甚至尝试过。但是,没有合理的方法来覆盖它。
路线B接近,但显示标注非常难以预料,因此无法接受作为解决方案。