【问题标题】:Passing a Double between ViewControllers Swift 3在 ViewControllers Swift 3 之间传递一个 Double
【发布时间】:2017-09-10 22:43:22
【问题描述】:

这里是 Swift 3 的总菜鸟。我需要做的就是通过 2 个用户输入文本字段将一个双精度值从一个 ViewController 传递到另一个。我尝试了许多解决方案,并阅读了在 ViewControllers 之间传递数据的所有内容。我收到“致命错误:在展开可选值时意外发现 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!)!

}

}

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

}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

    试试这个:

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

    【讨论】:

      【解决方案2】:

      第一,展开。当您尝试解包变量时,而不是强制解包它,最好测试它是否为 nil,或者您可以使用 if let 安全地解包它。

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

      【讨论】:

        【解决方案3】:

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

        将该变量传递给新控制器,并将该信息加载到其在 viewDidAppear 或 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
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-10-20
          • 1970-01-01
          • 2017-12-01
          • 2021-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多