2016-06-23 4 views
1

Я хочу передать данные широты и долготы другому контроллеру DestinationViewController. DestinationViewController содержит представление карты, так как пользователь переходит к новому представлению, они будут видеть карту эстакады, основанную на данных о местоположении (широте и долготе) в первом представлении.Как передать данные с контроллеров View?

Теперь есть несколько проблем, которые я объясню по пути.

ПЕРВЫЙ ВИД

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

NO error now, completely fine

} 

    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) 

No error at all

 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, то есть они существуют только в этой функции. Вот почему вы не можете получить к ним доступ из своей готовой системы. Сделайте их функциями класса, чтобы они существовали в области класса, объявляя их вне любой функции (я бы предложил в соответствии с вашим IBOutlet).

Это должно быть так:

@IBOutlet weak var slider: UISlider! 

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

Затем, когда вы установите их, вместо того, чтобы создать новую переменную с ЛПЭ просто изменить существующую переменную класса:

latitude = realLatlong[0] 

Вы должны быть в состоянии чтобы получить доступ к ним сейчас в вашей подготовке.

Обратите также внимание: либо дать им начальное значение следующим образом:

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 (поскольку вам требуются десятичные точки)

UPDATE:

адресация вашего последнего обновления кода здесь, потому что это легче, чем в комментариях:

в вашем изменении 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! 

Потому что нам нужно двойные значения, не Float значения

+0

Я сделал то, что вы предложили, я получил две ошибки, см. мое новое редактирование. –

+0

Изменение долготы и широты от Floats to Doubles. Затем, когда вы устанавливаете долготу и широту в sliderSlides, вы делаете их массивами вместо отдельных значений. Я обновил свой ответ – Sam

+0

В любом случае, чтобы получить значение ползунка вне функции @IBAction? –

0

Я считаю, проблема в том, что вы устанавливаете широту и долготу в Int. Попробуйте изменить тип данных с плавающей точкой, или что-то другой тип данных, как Double:

var latitude : Float! 
var longtitude : Float!