2017-09-10 34 views
0

這裏總的noob Swift 3.我需要做的就是通過2個用戶輸入文本字段從一個ViewController傳遞一個double值到另一個。我已經嘗試了很多解決方案,並且閱讀了ViewController之間傳遞數據的所有內容。我得到一個'致命錯誤:意外地發現零,同時解開可選值'。我真的很難理解變量的包裝和解包,我相信這很簡單。在ViewControllers之間傳遞一個Double Swift 3

這是我的第一個視圖控制器:

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

}

回答

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

我剛想通了!謝謝您的幫助!!! – Caridore

0

月1日,解纏。當你試圖解開變量,而不是強制打開它時,最好測試它是否爲零,或者如果讓它安全地解開它,可以使用。

2,將變量從一個VC傳遞到另一個。如你所知,在iOS中,那些VC實例就像任何其他變量。您只需要嘗試獲取對該VC的引用,然後將Double分配給其可訪問的變量。看看這個link

0

您可以創建兩個控制器之間的賽格瑞並通過重寫爲賽格瑞準備傳遞變量。

將該變量傳遞給新控制器,並將該信息加載到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 
     } 
    } 
} 
相關問題