2016-12-22 6 views
5

マップピンの名前を変数に格納して、それを第2のVCのラベルに表示しようとしています。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) 

    } 

} 

何が起こっている私はshopNameDataannotation.titleを保存しようとすると、問題はない、です。

ただし、注釈をクリックすると、annotation.titleのデータはshopNameDataに保存されず、デフォルトのデータが表示されます。

enter image description here

私は私がここに間違って行ってきた場所がわからないんだけど。

EDIT

私はShopDetailViewControllerを提示どこで用意しました。

+0

ナビゲーションや存在のないコードがありませんか? –

+0

どのように 'ShopDetailViewController'をプレゼンテーションしていますか? IBからのソートボードまたはコードからのperformSegue? –

+0

@ WarifAkhandRishiチェックを編集します。 – daanyyaal

答えて

2

ShopDetailViewControllerのインスタンスを作成して、値を設定してから何もしないでください。作成したShopDetailViewControllerのインスタンスが範囲外になり、割り当てが解除されます。

どのようにShopDetailViewControllerを提示していますか?あなたはセグを使用していますか?その場合は、prepareForSegue()メソッドをオーバーライドして、ShopDetailViewControllerのインスタンス化されたバージョンを表示します。このバージョンは、表示され、スコープ外に出てこないで、そこにshopNameDataプロパティを設定するだけです。

EDIT:あなたはビューコントローラを提示する方法を明確にするための

感謝。だから、あなたはコメントに答えるために:

あなたが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がView Controllerを提示する準備をしているときに関連情報を引き出します。私はそれが理にかなったことを願う

+0

私は2番目のVCを提示する場所を追加しました。どのように私はそれを無効にするのですか? – daanyyaal

+0

VCがどのように表示されているかについての情報を追加しました。 – dlbuckley

+0

タイプ 'MKAnnotationViewにメンバー'タイトルがありません 'の値を示すエラーが発生しました。 – daanyyaal

0

オーバーライドはそうのようなセグエ方法の準備:

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! 
      } 
     } 
    } 
関連する問題