Ios 在View3之间传递双精度

Ios 在View3之间传递双精度,ios,swift,Ios,Swift,这里的noob总数为Swift 3。我所需要做的就是通过2个用户输入文本字段将一个双值从一个ViewController传递到另一个ViewController。我已经尝试了许多解决方案,并阅读了有关在ViewController之间传递数据的所有内容。我得到一个“致命错误:在展开可选值时意外发现nil”。我很难理解变量的包装和解包,我相信这很简单 这是我的第一个ViewController: import UIKit var longitude: Double? var latitude:

这里的noob总数为Swift 3。我所需要做的就是通过2个用户输入文本字段将一个双值从一个ViewController传递到另一个ViewController。我已经尝试了许多解决方案,并阅读了有关在ViewController之间传递数据的所有内容。我得到一个“致命错误:在展开可选值时意外发现nil”。我很难理解变量的包装和解包,我相信这很简单

这是我的第一个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!)!

}

}
这是第二个ViewController:

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

}第一,展开。当您尝试打开变量时,最好测试它是否为零,或者您可以使用if let安全地打开它


第二,将变量从一个VC传递到另一个VC。正如您所知,在iOS中,这些VCs实例与任何其他变量一样。您所需要做的就是尝试获取对该VC的引用,然后将Double分配给其可访问变量。看看这个

避免全局可变状态。将数据从一个场景发送到另一个场景

试试这个:

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

您可以在两个控制器之间创建一个segue,并通过重写prepare for segue来传递变量

将该变量传递给新控制器,并在ViewDidDisplay或ViewWillDisplay上将该信息加载到其出口

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