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

时间:2016-12-22 11:11:07

标签: 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)")

    }
}

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中,只显示默认数据。

enter image description here

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

修改

我已将ShopDetailViewController列入其中。

2 个答案:

答案 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!
           }
        }
    }