swift如何将数据从视图控制器传递?

标签: Xcode ios Swift
发布时间: 2017/3/6 22:56:23
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要将数据纬度和经度数据传递给另一个控制器被称为 DestinationViewController。DestinationViewController 包含地图视图,所以作为用户过渡到一个新的视图,他们会看到天桥地图基于位置 (经度和纬度) 的第一个视图中的数据。

现在是一路走来,我会解释的几个问题。

第一个视图

import UIKit
import MapKit
import CoreLocation

class SliderViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var slider: UISlider!
   private var latitude : [Double]!
   private var longtitude : [Double]!
    override func viewDidLoad() {
        sliderSlides(self)

    }

  @IBAction func sliderSlides(sender: AnyObject) {

        let userChoice = Double(self.slider.value)

var realLatlong = [double]()
        if userChoice == 1 {
            realLatlong = [40.7484405, -73.9856644]
        }  else if possibility == 2 {
            realLatlong = [42.7484405, -4.9856644]
        } else {
            realLatlong = [50.7484405, -7.9856644]

        }


    latitude = [realLatlong[0]]
    longitude = [realLatlong[1]]

没有错误现在,也完全没问题

}

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

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "sendLocationdata") {
            var destination: DestinationViewController = segue.destinationViewController
            as! DestinationViewController

SIGABART

           destination.latitude = latitude
            destination.longtitude = longitude


        }
    }

}

DestinationViewController

import UIKit
import MapKit
import CoreLocation

class DestinationViewController: UIViewController, MKMapViewDelegate {

    var latitude : Float!
    var longtitude : Float!
    let distance: CLLocationDistance = 700
    let pitch: CGFloat = 65
    let heading = 90.0
    var camera = MKMapCamera()
    var coordinate: CLLocationCoordinate2D!



    @IBOutlet var flyoverView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        coordinate = CLLocationCoordinate2D(latitude: latitude,
                                        longitude: longitude)

在所有没有错误

        flyoverView.mapType = .SatelliteFlyover

        camera =  MKMapCamera(lookingAtCenterCoordinate: coordinate,
                              fromDistance: distance,
                              pitch: 0,
                              heading: 0)
        self.flyoverView.camera = camera

        // Do any additional setup after loading the view.
    }


    override func viewDidAppear(animated: Bool) {
        let pitchedCamera = MKMapCamera(lookingAtCenterCoordinate: coordinate, fromDistance: distance, pitch: pitch, heading: 0)
        let rotatedCamera = MKMapCamera(lookingAtCenterCoordinate: coordinate, fromDistance: distance, pitch: pitch, heading: 180)

        UIView.animateWithDuration(5.0, animations: {
            self.flyoverView.camera = pitchedCamera

            }, completion: {
                (Completed: Bool) -> Void in

                UIView.animateWithDuration(25.0, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: {
                    self.flyoverView.camera = rotatedCamera
                    }, completion: nil)

        })

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


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

请帮我。留下评论,如果你需要更多的信息,谢谢 !

解决方法 1:

为你的第一个错误,经度和纬度是中的 sliderSlides 函数,这意味着他们只存在于该函数范围的变量。这就是为什么你不能从你的 prepareForSegue 访问它们。让他们类功能,以便他们在类的范围中存在由宣布他们 (我建议下你 IBOutlet) 任何函数外部。

它应该是像这样︰

@IBOutlet weak var slider: UISlider!

private var latitude:Double!
private var longitude:Double!

然后当你设置它们,而不是创建一个新变量与让,只是改变现有的类变量︰

latitude = realLatlong[0]

你应该能够访问它们现在在你的 prepareForSegue。

此外注意到︰ 要么给他们一个初始值就像这样︰

private var latitude:Double = 0.0 //Or some default number

或检查它是否为零的 prepareForSegue,因为目前他们将只能得到设置如果获取调用 sliderSlides 函数。

为你的第二个错误︰

您不能使用实例变量 (经度和纬度) 来定义另一个实例变量 (坐标)。你应该声明坐标作为一个类的变量,但不是设置它的值,直到加载此视图。

替换︰

let coordinate = CLLocationCoordinate2D(latitude: latitude,
                                        longitude: longitude)

与︰

var coordinate: CLLocationCoordinate2D!

然后在你的 viewDidLoad 中添加︰

coordinate = CLLocationCoordinate2D(latitude: latitude,
                                    longitude: longitude)

如果你真的不想要初始化的坐标在 viewDidLoad 你也可以做︰

var coordinate: CLLocationCoordinate2D {
    get {
        return CLLocationCoordinate2D(latitude: latitude,
                                    longitude: longitude)
    }
}

但是我强烈建议对此,您将创建一个新的 CLLocationCoordinate2D 变量,每次你调用坐标。此外请注意,这将更新坐标值 (在将来使用),每当您更改纬度和经度

此外注意到︰ 纬度和经度不应该的类型为 Int (如你要求使用十进制点)

更新︰

解决您最新的代码更新,因为它比在评论中更容易︰

在你的 SliderViewController 更改︰

private var latitude : [Double]!
private var longtitude : [Double]!

private var latitude : Double!
private var longtitude : Double!

因为纬度和经度是单个变量,不是数组。

在 sliderSlides 函数更改︰

latitude = [realLatlong[0]]
longitude = [realLatlong[1]]

latitude = realLatlong[0]
longitude = realLatlong[1]

再次,是因为他们的单值,不是数组。

然后在你的 DestinationViewController,更改︰

var latitude : Float!
var longtitude : Float!

var latitude : Double!
var longtitude : Double!

因为我们需要不的浮点型值的双精度值

赞助商