2017-01-09 1 views
0

J'essaie de définir une variable/constante dans Swift en utilisant une valeur provenant d'une fonction qui trouve l'emplacement actuel de l'utilisateur alors que l'application est ouverte. Lorsque je décommente la fonction d'impression, elle imprime avec succès les coordonnées, mais je ne peux pas accéder à la valeur en dehors de la fonction.Impossible d'obtenir les coordonnées de CLLocationManager dans une variable/constante séparée

J'ai actuellement cela comme une partie de mon code qui est dans le fichier MainVC.swift dans le cadre de la classe MainVC:

import UIKit 
import MapKit 
import CoreLocation 

class MainVC: UIViewController, CLLocationManagerDelegate { 
    //Map 
    @IBOutlet weak var map: MKMapView! 

    let manager = CLLocationManager() 
    let coordinates = locationManager() 
    //I've also tried using let coordinates = currentCoords 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     manager.delegate = self 
     manager.desiredAccuracy = kCLLocationAccuracyBest 
     manager.requestWhenInUseAuthorization() 
     manager.startUpdatingLocation() 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) -> String { 
     let location = locations[0] 

     let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01) 
     let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 
     let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
     map.setRegion(region, animated: true) 
     lat = String(myLocation.latitude) 
     long = String(myLocation.longitude) 
     let currentCoords:String = "\(lat);\(long)" 

     //print(currentCoords) 
     self.map.showsUserLocation = true 

     return currentCoords 
    } 
} 

Cependant, je suis confronté à cette erreur:

"Cannot use instance member 'locationManager' within property initializer; property initializers run before 'self' is available".

Quand je change le code et utiliser

let coordinates = currentCoords 

je reçois une autre montrant erreur:

"Use of unresolved identifier 'currentCoords'"

J'ai aussi essayé d'utiliser un var paresseux et let paresseux.

+0

Vous devez fournir un peu plus de contexte pour le code que vous avez publié. – rmaddy

+0

Votre erreur ne provient-elle pas de votre initialiseur? collez le code à partir de votre ** initialiseur ** où vous obtenez l'erreur. – Honey

+0

@rmaddy désolé à ce sujet, j'ai oublié de l'ajouter lors de la publication initiale, mis à jour le poste principal avec un peu de contexte, espérons que cela aide. – Miles

Répondre

0

Vous devriez juste être en mesure d'accéder locationManager.location .coordinate comme dans ma méthode de ButtonClick:

import UIKit 
import MapKit 

class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { 

    let locationManager = CLLocationManager() 

    @IBAction func buttonClick(_ sender: Any) { 
     let location = locationManager.location?.coordinate 
     let lat:Double = (location?.latitude)! 
     let lon:Double = (location?.longitude)! 
     print(lat,lon) 
    } 

    @IBOutlet weak var mapView: MKMapView! 

     override func viewDidLoad() { 
     super.viewDidLoad() 

     mapView.delegate = self 
     mapView.showsUserLocation = true 
     mapView.userTrackingMode = .follow 

     locationManager.delegate = self 
     locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 

    } 

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

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     print("viewDidAppear") 
     // status is not determined 
     if CLLocationManager.authorizationStatus() == .notDetermined { 
      locationManager.requestAlwaysAuthorization() 
     } 
      // authorization were denied 
     else if CLLocationManager.authorizationStatus() == .denied { 
      showAlert("Location services were previously denied. Please enable location services for this app in Settings.") 
     } 
      // we do have authorization 
     else if CLLocationManager.authorizationStatus() == .authorizedAlways { 
      locationManager.startUpdatingLocation() 
     } 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     print("didUpdateLocations") 
     print(locations.last?.coordinate) 
    } 

    func showAlert(_ title: String) { 
     let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert) 
     alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 
      alert.dismiss(animated: true, completion: nil) 
     })) 
     self.present(alert, animated: true, completion: nil) 

    } 
} 
+0

Salut, merci de poster. J'ai essayé de le faire de cette façon, mais pour une raison quelconque, il n'aime pas cette méthode, je vais poster l'erreur que je reçois avec cette méthode dès que je serai sur mon MacBook demain. – Miles

+0

Je reçois l'erreur suivante: Valeur du type '(MainVC) -> (CLLocationManager, [CLLocation]) -> Chaîne' n'a aucun 'emplacement' membre – Miles

+0

S'il vous plaît signaler le code qui provoque cette erreur – CoderMike

0

Voici comment vous définissez votre variable publique

let coordinates:CLLocation = nil 

Ensuite, dans votre didUpdateLocations assignent la variable de coordonnées avec le dernier élément du tableau d'emplacements. Ensuite, vous aurez accès à partout. Gardez à l'esprit didUpdateLocations peut être appelé même jusqu'à quelques secondes plus tard, de sorte que vos coordonnées de variables publiques seront remplies après quelques secondes environ.

func coordinatesBecomeAvailable() { 
    // Here you can print your coordinates or start using them for the first time 
} 
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
let firstTime:Bool = (coordinates == nil) 
coordinates = locations[0] 
if (firstTime) // This is first time this function is called 
    coordinatesBecomeAvailable() 
...... 
< Rest of your code here > 
...... 
< This function does have any return value! no String nothing > 
} 

Vous avez juste besoin de vérifier si la valeur des coordonnées est nulle ou non. Ou vous pouvez vérifier à l'intérieur de didUpdateLocations si c'est la première fois que cette méthode déléguée est appelée. Ce n'est pas la manière la plus efficace et la plus complète d'initialiser et d'utiliser le gestionnaire de localisation et je suppose que vous venez de poster le code lié à votre problème.

+0

J'ai changé mon code et ajouté ceci mais quand j'imprime les coordonnées il montre – Miles

+0

que j'ai changé le code ainsi vous savez quand imprimer les coordonnées quand elles deviennent disponibles. –

+0

@robycyr pour une raison quelconque Je ne reçois toujours rien – Miles