Ios 如何在Swift中创建pin注释标注?
我试着让调用工作,但没有发生,因为我做了一些错误的准备赛格。我想知道如何在另一个视图中创建pin注释标注?点击标注中的按钮时,切换到另一个场景的过程如下所示:Ios 如何在Swift中创建pin注释标注?,ios,swift,mapkit,callouts,Ios,Swift,Mapkit,Callouts,我试着让调用工作,但没有发生,因为我做了一些错误的准备赛格。我想知道如何在另一个视图中创建pin注释标注?点击标注中的按钮时,切换到另一个场景的过程如下所示: 将地图视图的代理设置为视图控制器。您可以在Interface Builder的“Connections Inspector”中或以编程方式执行此操作。您希望指定视图控制器也符合MKMapViewDelegate 创建注释时,请确保也设置了标题: let annotation = MKPointAnnotation() annotation
MKMapViewDelegate
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = ...
mapView.addAnnotation(annotation)
class CustomAnnotationView: MKPinAnnotationView { // or nowadays, you might use MKMarkerAnnotationView
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
canShowCallout = true
rightCalloutAccessoryView = UIButton(type: .infoLight)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
MKMapView
使用此注释视图。iOS 11简化了这一过程,但我将描述如何以两种方式实现这一点:
- 如果您的最低iOS版本是11(或更高版本),您只需在中注册自定义注释视图作为默认值,就完成了。在iOS 11及更高版本中,通常根本不实现
。(实现该方法的唯一时间是,如果您需要注册多个重用标识符,因为您有多种类型的自定义注释类型。)mapView(uux0:viewFor:)
- 如果需要支持11之前的iOS版本,请确保将视图控制器指定为
的代理,然后将实现MKMapView
:mapView(uuquo:viewFor:)
.infoLight
按钮:
calloutAccessoryControlTapped
:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
performSegue(withIdentifier: "SegueToSecondViewController", sender: view)
}
显然,这假设您已经在两个视图控制器之间定义了一个分段override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? SecondViewController,
let annotationView = sender as? MKPinAnnotationView {
destination.annotation = annotationView.annotation as? MKPointAnnotation
}
}
有关上述的Swift 2实现,请参见。事实上,如何允许用户编辑pin注释但是,当我设置mapView.delgate=self时,它会崩溃,因为我的地理代码用于其他内容。你知道我如何解决这个问题吗?我能想象的
mapView.delegate=self
崩溃的唯一原因是mapView
被隐式打开,但nil
(例如,插座没有连接)。
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
performSegue(withIdentifier: "SegueToSecondViewController", sender: view)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? SecondViewController,
let annotationView = sender as? MKPinAnnotationView {
destination.annotation = annotationView.annotation as? MKPointAnnotation
}
}