2017-09-10 7 views
0

Insgesamt noob hier zu Swift 3. Alles, was ich tun muss, ist einen doppelten Wert von einem ViewController zu einem anderen über die 2 Benutzereingabe Textfelder übergeben. Ich habe zahlreiche Lösungen ausprobiert und alles gelesen, was ich bei der Weitergabe von Daten zwischen ViewControllern finden kann. Ich erhalte einen "fatalen Fehler: unerwartet wurde beim Dekomprimieren eines optionalen Werts Null gefunden". Es fällt mir schwer zu verstehen, wie die Variablen verpackt und entpackt werden, und ich bin mir sicher, dass es etwas Einfaches ist.Übergeben eines Double zwischen ViewControllers Swift 3

Hier ist mein erster Viewcontroller:

import UIKit 

var longitude: Double? 
var latitude: Double? 



class ViewController: UIViewController { 

@IBOutlet var getLongitude: UITextField! 
@IBOutlet var getLatitude: UITextField! 

@IBOutlet var mapbutton: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 

     } 

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

@IBAction func MapBtn(_ sender: Any) { 

    performSegue(withIdentifier: "segue", sender: self) 
    longitude = Double(getLongitude.text!)! 
    latitude = Double(getLatitude.text!)! 

} 

} 

Und das ist der SecondViewController:

class SecondViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let camera = GMSCameraPosition.camera(withLatitude: latitude!, longitude: longitude!, zoom: 6.0) 
    let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
    view = mapView 
    // Creates a marker in the center of the map. 
    let marker = GMSMarker() 
    marker.position = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!) 
    marker.map = mapView 

} 

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

}

Antwort

1

Vermeiden globalen veränderbaren Zustand. Senden Sie Daten von einer Szene zu einer anderen.

Try this:

class ViewController: UIViewController { 

    @IBOutlet weak var longitudeTextField: UITextField! 
    @IBOutlet weak var latitudeTextField: UITextField! 
    @IBOutlet weak var mapButton: UIButton! 

    @IBAction func didTapToMapButton(_ sender: UIButton) { 

    // I assume your storyboard' name is Main. If not, change it below accordingly 
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) 

    // I assume your destination view controller' identifier and type is SecondViewController. If not, change it below accordingly. 
    if let secondViewController = mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController { 

     if let longitude = Double(longitudeTextField.text), 
     let latitude = Double(latitudeTextField.text) { 

     secondViewController.latitude = latitude 
     secondViewController.longitude = longitude 
     } 

     present(secondViewController, animated: true, completion: nil) 
    } 
    } 
} 

class SecondViewController: UIViewController { 

    var latitude: Double? 
    var longitude: Double? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    if let latitude = latitude, 
     let longitude = longitude { 

     let camera = GMSCameraPosition.camera(withLatitude: latitude, longitude: longitude, zoom: 6.0) 
     let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
     view = mapView 

     // Creates a marker in the center of the map. 
     let marker = GMSMarker() 
     marker.position = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
     marker.map = mapView 
    } 
    } 
} 
+0

Ich habe das gerade herausgefunden! Danke für die Hilfe!!! – Caridore

0

1., Auswickeln. Wenn Sie versuchen, die Variable auszupacken, eher energisch auszupacken, ist es besser zu testen, ob es Null ist, oder Sie könnten verwenden, wenn Sie es sicher auspacken können.

2. Variable von einem VC an einen anderen übergeben. Wie Sie wissen, sind diese VC-Instanzen in iOS wie jede andere Variable. Alles, was Sie tun müssen, ist, einen Verweis auf diesen VC zu holen, und dann den Double seiner zugreifbaren Variablen zuzuweisen. Werfen Sie einen Blick auf diese link

0

Sie könnten einen Übergang zwischen den beiden Controllern erstellen und die Variable übergeben, indem für segue zwingende vorzubereiten.

Übergeben Sie diese Variable an den neuen Controller und laden Sie diese Informationen in den outlet on viewDidAppear oder viewWillAppear.

self.prepare(for: "segueName", sender: self) 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "segueName" { 

     if let vc = segue.destination as? DestinationViewController { 

      // Pass Data to New View Controller 
     } 
    } 
} 
Verwandte Themen