如何将自定义属性从 Mapbox 注释传递到其标注视图?
How do I pass in custom properties from Mapbox annotation to its callout view?
我将 MGLAnnotation
子类化以添加额外的 属性 var tags
,如下所示:
class MasterMapAnnotation: NSObject, MGLAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
var tags: String?
init(coordinate: CLLocationCoordinate2D, title: String?, subtitle: String?, tags: String?) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
self.tags = tags
}
}
这是传递到地图中的注释:
let annotation = MasterMapAnnotation(coordinate: CLLocationCoordinate2D(latitude: 50.0, longitude: 50.0), title: "Numero Uno", subtitle: "Numero Uno subtitle", tags: "#tag1 #tag2")
mapView.addAnnotation(annotation)
mapView 委托调用自定义标注视图:
func mapView(_ mapView: MGLMapView, calloutViewFor annotation: MGLAnnotation) -> MGLCalloutView? {
return MasterMapCalloutView(representedObject: annotation)
}
所以在标注视图子类(下面)中,我如何访问这个新的 属性 tags
?
class MasterMapCalloutView: UIView, MGLCalloutView {
var representedObject: MGLAnnotation
let dismissesAutomatically: Bool = false
let isAnchoredToAnnotation: Bool = true
lazy var leftAccessoryView = UIView()
lazy var rightAccessoryView = UIView()
weak var delegate: MGLCalloutViewDelegate?
required init(representedObject: MGLAnnotation) {
self.representedObject = representedObject
super.init(frame: .zero)
}
required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// callout view delegate: present callout
func presentCallout(from rect: CGRect, in view: UIView, constrainedTo constrainedView: UIView, animated: Bool) {
if !representedObject.responds(to: #selector(getter: MGLAnnotation.title)) {
return
}
view.addSubview(self)
let title = representedObject.title
let tags = representedObject.tags // how to access this?
}
}
问题显然是子类 (MasterMapAnnotation
) 拥有自定义 tags
属性,而不是它的超类 (MGLAnnotation
) 但我不知道如何 (a)将 representedObject 设置为 MasterMapAnnotation
或 (b) 只需访问 MasterMapAnnotation
自定义 属性 而无需重新配置协议。
我可能遗漏了一些东西,但您肯定只是检查是否可以将 MGLAnnotation 对象转换为 MasterMapAnnotation:
guard let masterAnnotation : MasterMapAnnotation = representedObject as? MasterMapAnnotation else { return }
let tags : String? = masterAnnotation.tags
// etc
显然,除了使用 guard 之外,还有其他方法可以控制流量,但我希望你能理解要点。
我将 MGLAnnotation
子类化以添加额外的 属性 var tags
,如下所示:
class MasterMapAnnotation: NSObject, MGLAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
var tags: String?
init(coordinate: CLLocationCoordinate2D, title: String?, subtitle: String?, tags: String?) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
self.tags = tags
}
}
这是传递到地图中的注释:
let annotation = MasterMapAnnotation(coordinate: CLLocationCoordinate2D(latitude: 50.0, longitude: 50.0), title: "Numero Uno", subtitle: "Numero Uno subtitle", tags: "#tag1 #tag2")
mapView.addAnnotation(annotation)
mapView 委托调用自定义标注视图:
func mapView(_ mapView: MGLMapView, calloutViewFor annotation: MGLAnnotation) -> MGLCalloutView? {
return MasterMapCalloutView(representedObject: annotation)
}
所以在标注视图子类(下面)中,我如何访问这个新的 属性 tags
?
class MasterMapCalloutView: UIView, MGLCalloutView {
var representedObject: MGLAnnotation
let dismissesAutomatically: Bool = false
let isAnchoredToAnnotation: Bool = true
lazy var leftAccessoryView = UIView()
lazy var rightAccessoryView = UIView()
weak var delegate: MGLCalloutViewDelegate?
required init(representedObject: MGLAnnotation) {
self.representedObject = representedObject
super.init(frame: .zero)
}
required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// callout view delegate: present callout
func presentCallout(from rect: CGRect, in view: UIView, constrainedTo constrainedView: UIView, animated: Bool) {
if !representedObject.responds(to: #selector(getter: MGLAnnotation.title)) {
return
}
view.addSubview(self)
let title = representedObject.title
let tags = representedObject.tags // how to access this?
}
}
问题显然是子类 (MasterMapAnnotation
) 拥有自定义 tags
属性,而不是它的超类 (MGLAnnotation
) 但我不知道如何 (a)将 representedObject 设置为 MasterMapAnnotation
或 (b) 只需访问 MasterMapAnnotation
自定义 属性 而无需重新配置协议。
我可能遗漏了一些东西,但您肯定只是检查是否可以将 MGLAnnotation 对象转换为 MasterMapAnnotation:
guard let masterAnnotation : MasterMapAnnotation = representedObject as? MasterMapAnnotation else { return }
let tags : String? = masterAnnotation.tags
// etc
显然,除了使用 guard 之外,还有其他方法可以控制流量,但我希望你能理解要点。