2016-12-18 5 views
0

Ich fordere den Benutzer auf, Breiten- und Längskoordinaten von einem anderen View-Controller einzugeben. Ich bin nicht sicher, wie man diese Koordinaten in eine Karte übersetzt, wo eine Nadel fallen gelassen werden kann. Unten ist eine Aufstellung meines Storyboards.Swift Add-Pin-Position von Eingangskoordinaten

enter image description here

Sollte ich UserDefaults werden unter Verwendung der gespeicherten Koordinaten oder eine globale Variable zu übertragen? Ich bin mir nicht sicher, wie ich das am besten angehen kann.

Antwort

1

Sie übergeben den Parameter vom ersten View-Controller an den zweiten View-Controller, indem Sie eine seiner Eigenschaften festlegen.

Hier ist eine Schritt-für-Schritt-Anleitung:

1 - In Ihrem FirstViewController, implementieren das UITabBarControllerDelegate Protokoll

class FirstViewController: UIViewController, UITabBarControllerDelegate { 
    @IBOutlet weak var latitudeField: UITextField! 
    @IBOutlet weak var longtitudeField: UITextField! 

    var coordinates = [CLLocationCoordinate2D]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tabBarController?.delegate = self 
    } 

    @IBAction func addCoordinates(_ sender: Any) { 
     guard let lat = Double(latitudeField.text!), let long = Double(longtitudeField.text!) else { 
      return 
     } 

     self.coordinates.append(CLLocationCoordinate2D(latitude: lat, longitude: long)) 
    } 

    // This method will be called whenever you are switching tab 
    // Note that the viewController can be the same view controller, i.e. FirstViewController 
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
     guard let secondViewController = viewController as? SecondViewController else { 
      return 
     } 
     secondViewController.coordinates = self.coordinates 
    } 
} 

2 - In Ihrem SecondViewController Anzeige einen Stift für die Koordinate:

class SecondViewController: UIViewController, MKMapViewDelegate { 
    @IBOutlet weak var mapView: MKMapView! 

    var coordinates = [CLLocationCoordinate2D]() { 
     didSet { 
      // Update the pins 
      // Since it doesn't check for which coordinates are new, it you go back to 
      // the first view controller and add more coordinates, the old coordinates 
      // will get a duplicate set of pins 
      for (index, coordinate) in self.coordinates.enumerated() { 
       let annotation = MKPointAnnotation() 
       annotation.coordinate = coordinate 
       annotation.title = "Location \(index)" 

       mapView.addAnnotation(annotation) 
      } 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     mapView.delegate = self 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
     let identifier = "pinAnnotation" 
     var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView 

     if annotationView == nil { 
      annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) 
      annotationView?.canShowCallout = true 
     } 

     annotationView?.annotation = annotation 
     return annotationView 
    } 
} 
+0

Ah ich sehe, so sind Sie in der Lage, "secondViewController.coordinate" über den Übergang zum secondViewController zu übergeben? Außerdem war ich in meiner Problemstellung nicht klar, aber ich möchte nicht, dass der Button zum secondViewController übergeht. Also das Klicken auf den Button "Add to Map!" bleibt in diesem FirstViewController. Wie kann ich Informationen weitergeben, ohne das Segment zu verwenden? – Kevin

+0

Sie fügen die Koordinaten in einem Array in 'FirstViewController' hinzu. Wenn die Zeit gekommen ist, in der die Kartenansicht verschoben wird, legen Sie sie in der Methode 'prepare' fest. –

+0

Ich habe Probleme, diesen Versuch zu arbeiten. Mein firstViewController und secondViewController befinden sich auf verschiedenen Registerkarten (Registerkarte Controller). Ich habe den Anmerkungsdelegierten auf den secondViewController-Code implementiert, und ich versuche, den Pin zu erhalten, der hinzugefügt wird, nachdem der Knopf geschlagen wird, sobald der Benutzer Registerkarten wechselt, jedoch habe ich kein Glück. – Kevin