2016-12-22 2 views
5

Ich versuche, den Namen eines Map-Pins in einer Variablen zu speichern, und zeige ihn dann auf einem Etikett auf meinem zweiten VC an.Swift: Daten werden nicht in Variablen gespeichert, wenn VC übergeben wird.

Derzeit ist das, was ich habe.

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) 

    } 

} 

Was geschieht, wenn ich zu speichern annotation.title in shopNameData versuchen, ist es kein Problem. Wenn ich auf die Annotation klicke, werden die Daten von annotation.title nicht länger in shopNameData gespeichert und zeigen einfach die Standarddaten an.

enter image description here

Ich bin mir nicht sicher, wo ich hier falsch gegangen.

EDIT

ich eingeschlossen habe, wo ich ShopDetailViewController präsentieren.

+0

Es gibt keinen Code der Navigation oder Gegenwart? –

+0

Wie präsentieren Sie 'ShopDetailViewController'? ein Sotryboard-Segment von IB oder performSegue vom Code? –

+0

@WarifAkhandRishi überprüfen bearbeiten. – daanyyaal

Antwort

2

Sie erstellen einfach eine Instanz der ShopDetailViewController, setzen den Wert und dann nichts damit zu tun. Die Instanz ShopDetailViewController, die Sie erstellt haben, geht nicht in den Geltungsbereich und wird freigegeben.

Wie präsentieren Sie die ShopDetailViewController? Benutzt du einen Übergang? Wenn Sie dann sind, sollten Sie die prepareForSegue() Methode überschreiben, wo Sie eine instanziierte Version des ShopDetailViewController erhalten werden, die dargestellt wird und nicht außerhalb des Bereichs gehen und dann einfach die shopNameData Eigenschaft dort setzen.

EDIT:

Dank für die Klärung der Art und Weise Sie die View-Controller präsentieren. So beantworten Sie einen Kommentar:

Sie müssen FirstVC gehen und so etwas wie den folgenden Code hinzu:

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 
    } 
} 

dann nach, dass Sie den Code einfach entfernen kann in Ihrem func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) Methode und den Code halten in Ihrem func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) Methode.

Auf diese Weise rufen Sie einfach an und übergeben den MKAnnotationView als Absender und ziehen dann die relevanten Informationen heraus, wenn sich das Segment auf die Präsentation Ihres View Controllers vorbereitet. Ich hoffe das ergibt Sinn.

+0

Ich habe hinzugefügt, wo ich die zweite VC präsentiere. Wie überschreibe ich es? – daanyyaal

+0

Ich habe meine Antwort aktualisiert, um ein bisschen mehr zu erklären, jetzt haben Sie Informationen darüber hinzugefügt, wie die VC präsentiert wird. – dlbuckley

+0

Ich erhalte eine Fehlermeldung mit dem Wert des Typs 'MKAnnotationView hat kein Mitglied' title '. – daanyyaal

0

außer Kraft setzen, wie so für segue Verfahren vorbereiten:

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! 
      } 
     } 
    } 
Verwandte Themen