2016-05-17 12 views
1

Ich habe ein Problem mit LocationManager in Swift 2.0. Seine meine Lage Klasse:Swift 2.0 LocationManager ist null

*

import Foundation 
import CoreLocation 
class Location : NSObject, CLLocationManagerDelegate { 

    var locationManager: CLLocationManager? 
    var coordinate: CLLocationCoordinate2D? 


    func locationManagerStart() { 

     if locationManager == nil { 

      locationManager = CLLocationManager() 
      locationManager?.delegate = self; 
      locationManager?.desiredAccuracy = kCLLocationAccuracyBest 
      locationManager?.requestWhenInUseAuthorization() 
     } 

     locationManager?.startUpdatingLocation() 

    } 

    func locationManagerStop() { 

     locationManager?.stopUpdatingLocation() 
    } 

    //MARK: CLLocationManagerDelegate 

    func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { 

     coordinate = newLocation.coordinate 

    } 

*

Ich schaffe Objekt in dieser Klasse in AppDelegate:

let location = Location() 

und Stelle beginnen, wenn meine app wurde aktiv:

func applicationDidBecomeActive(application: UIApplication) { 


     location.locationManagerStart() 

    } 

Später in meinem Code muss ich überprüfen, ob ich Zugang zum Standort habe. Ich bin suer ich habe, weil ich Standort auf in iPhone und ich nahm meine Position zu verwenden:

func haveAccessToLocation() -> Bool { 

     if (coordinate?.latitude) != nil { 

      return true 

     }else { 

      return false 
     } 

    } 

Mein cordinate?.latitude/longitude ist null und meine locationManager ist gleich Null zu und ich weiß nicht, warum

+0

Sie führen dies auf Simulator? - Testen Sie es auf einem echten Gerät. – Fennec

+0

haben Sie didUpdateToLocation überprüft, um angerufen zu werden oder nicht –

+1

zeigt es Popup an, um den Standort zu aktivieren, wenn Sie Ihre App zum ersten Mal ausführen? –

Antwort

0

Sie sagten:

Mein coordinate?.latitude/longitudenil ist ...

Wenn locationManager nicht 0 ist, aber coordinate bedeutet, dass Sie einfach nach coordinate suchen, bevor der Standortmanager erfolgreich den Standort abrufen konnte. Es kann einige Sekunden dauern.

... und meine locationManager ist nil, auch.

Wenn Sie genannt locationManagerStart, aber Sie überprüft später locationManager und es war nil, das bedeutet, dass Sie zwei Instanzen von Location() in Ihrem Code haben könnten. Stellen Sie sicher, dass Sie immer auf die Instanz verweisen, die von dem Anwendungsdelegaten erstellt wird, und verweisen Sie auf anderen Verweisen auf .

Nebenbei kann das Instanziieren von Location in applicationDidBecomeActive mehrere Instanzen in bestimmten Fällen auch verursachen (weil, wenn die App inaktiv wird und wieder aktiv wird, Sie es erneut instanziieren). Ich würde vorschlagen, die Standortdienste in didFinishLaunchingWithOptions zu starten. Ich denke nicht, dass das hier das Problem ist, aber sei dir dieses Problem bewusst.