2017-11-05 4 views
0

Ich habe eine Singleton LocationManager-Klasse erstellt, um Standortaktualisierungen in meiner Anwendung zu verarbeiten. In der ersten Ansicht wird auf die gemeinsam genutzte Instanz in viewDidLoad zugegriffen und ein Aufruf an getCurrentLocation erfolgt. "Benutzerstandort wird abgerufen ..." wird auf der Konsole ausgegeben, die Delegatmethode didUpdateLocations auf dem Standortmanager wird jedoch nie aufgerufen und der Standort wird nicht aktualisiert. Ich habe die erforderlichen Schlüssel in der info.plist und die Eingabeaufforderungen für erwartete Berechtigungen angezeigt.LocationManager Singleton didUpdateLocations wird nicht aufgerufen

Ich habe das Gefühl, dies ist ein Threading-Problem mit der LocationManager fallen aus dem Anwendungsbereich, aber ich bin mir nicht sicher, wäre toll, wenn jemand mich in die richtige Richtung zeigen könnte!

Location Manager:

import Foundation 
import CoreLocation 

class LocationManager: NSObject, CLLocationManagerDelegate { 

static let shared = LocationManager() 
var manager: CLLocationManager! 

override init() { 
    super.init() 
    self.manager = CLLocationManager() 
    self.manager.delegate = self 
    if CLLocationManager.authorizationStatus() == .notDetermined { 
     self.manager.requestWhenInUseAuthorization() 
    } 
    self.manager.desiredAccuracy = kCLLocationAccuracyBest 
} 


public func getCurrentLocation(){ 
    print("Getting users location...") 
    self.manager.startUpdatingLocation() 
} 


func locationManager(manager:CLLocationManager, didUpdateLocations locations:[AnyObject]) { 
    self.manager.stopUpdatingLocation() 
    print("locations = \(locations)") 
} 

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
    print(error.localizedDescription) 
}} 

Viewcontroller:

import UIKit 

Klasse Viewcontroller: UIViewController {

@IBOutlet weak var titleLabel: UILabel! 
@IBOutlet weak var savedAreasTableView: UITableView! 
@IBOutlet weak var noSavedAreasLabel: UILabel! 
var manager: LocationManager! = LocationManager.shared 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.noSavedAreasLabel.text = "You have no saved areas available !\nTo add some, search for a location and then favourite it." 
    //Check here to see if user has any favourited areas 
    self.savedAreasTableView.isHidden = true 
    self.noSavedAreasLabel.isHidden = false 
    self.manager.getCurrentLocation() 

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

Antwort

1

Die richtige Delegatfunktion ist dies:

func locationManager(_ manager: CLLocationManager, 
     didUpdateLocations locations: [CLLocation]) 
+0

War im Begriff, das gleiche Problem zu lokalisieren ... Ich glaube, Sie haben genagelt;) –

+0

:) Entschuldigung, aber ich bin froh, dass wir den gleichen Gedanken hatten. –

+1

... würde nur hinzufügen, dass diese Protokollmethode 'optional' ist, daher wird der Compiler sie nicht als Fehler behandeln (aber ich habe sowieso zumindest eine Warnung erwartet). –

Verwandte Themen