我正在尝试将地图图钉的名称存储在变量中,然后将其显示在我的第二个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)")
}
}
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)
}
}
当我尝试在annotation.title
中存储shopNameData
时,会发生什么事情,这是没有问题的。
但是,当我点击注释时,来自annotation.title
的数据不再存储在shopNameData
中,只显示默认数据。
我不确定我在哪里出错了。
修改
我已将ShopDetailViewController
列入其中。
答案 0 :(得分:2)
您只是创建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
}
}
然后,您可以删除func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
方法中的代码,并将代码保存在func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
方法中。
这样您只需调用present并将MKAnnotationView作为发送者传递,然后在segue准备呈现您的视图控制器时拉出相关信息。我希望这是有道理的。
答案 1 :(得分:0)
覆盖为segue方法做准备,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (let view = sender as! MKAnnotationView) && (segue.identifier == "showAnnotationInfo") {
if annotation = view.annotation as? POIAnnotation {
let destVC = segue.destination as! ShopDetailViewController
destVC.shopNameData = annotation.title!
}
}
}