我正在尝试将地图引脚的名称存储在变量中,然后将其显示在我的第二个VC上的标签上.
目前,这就是我所拥有的.
FirstVC.swift
//Perform segue when callout has been tapped
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
self.performSegue(withIdentifier: "showAnnotationInfo", sender:view)
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
print("Annotation selected")
if let annotation = view.annotation as? POIAnnotations {
print("Your annotation title is: \(annotation.title!)")
// Instantiate ShopDetailViewController
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destVC = storyboard.instantiateViewController(withIdentifier: "shopDetailVC") as! ShopDetailViewController
destVC.shopNameData = annotation.title!
print("Shop name data has the value: \(destVC.shopNameData)")
}
}
Run Code Online (Sandbox Code Playgroud)
ShopDetailViewController.swift
class ShopDetailViewController: UIViewController {
@IBOutlet weak var shopName: UILabel!
var shopNameData = "data"
override func viewDidLoad() {
super.viewDidLoad()
self.shopName.text = self.shopNameData
print(shopNameData)
}
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是,当我试图存储annotation.title时shopNameData,没有问题.
但是,当我单击注释时,annotation.title不再存储shopNameData数据,只显示默认数据.
我不确定我在哪里出错了.
编辑
我已经把我介绍的地方包括在内ShopDetailViewController.
您只需创建 的实例ShopDetailViewController,设置值,然后不对其执行任何操作。您创建的实例ShopDetailViewController超出范围并被释放。
您如何展示ShopDetailViewController?你用的是segue吗?如果是,那么您应该重写该prepareForSegue()方法,在该方法中您将获得将呈现的实例化版本ShopDetailViewController,并且不会超出范围,然后只需shopNameData在其中设置属性即可。
编辑:
感谢您澄清呈现视图控制器的方式。所以回答你的评论:
您需要转到FirstVC并添加类似以下代码的内容:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? ShopDetailViewController,
let annotationView = sender as? MKAnnotationView,
let annotation = annotationView.annotation as? POIAnnotations {
viewController.shopNameData = annotation.title
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以删除方法中的代码func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)并将代码保留在func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)方法中。
这样,您只需调用present并作为发送者传递MKAnnotationView,然后在segue准备呈现您的视图控制器时提取相关信息。我希望这是有道理的。