Swift:数据在通过VC时不存储在变量中

daa*_*aal 5 ios swift

我正在尝试将地图引脚的名称存储在变量中,然后将其显示在我的第二个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.titleshopNameData,没有问题.

但是,当我单击注释时,annotation.title不再存储shopNameData数据,只显示默认数据.

在此输入图像描述

我不确定我在哪里出错了.

编辑

我已经把我介绍的地方包括在内ShopDetailViewController.

dlb*_*ley 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
    }
}
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准备呈现您的视图控制器时提取相关信息。我希望这是有道理的。