2015-06-19 7 views
9

Ich versuche, eine grundlegende Kartenansicht zu implementieren und den aktuellen Standort eines Benutzers als Annotation der Karte hinzuzufügen. Ich habe den Requestwheninuse-Schlüssel zu meiner Datei info.plist hinzugefügt und CoreLocation importiert.sofortige Verarbeitung von Standortberechtigungen in swift

Meiner Ansicht Controller hat Load-Methode, habe ich folgendes:

locManager.requestWhenInUseAuthorization() 
var currentLocation : CLLocation 

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){ 

    currentLocation = locManager.location 
    println("currentLocation is \(currentLocation)")  
} 
else{ 
    println("not getting location") 
    // a default pin 
} 

Ich bin die prompte Wieder bekommen. Erlaubnis zum Abrufen des Standorts. Da dies geschieht, bekomme ich meinen Ausdruck, der sagt, dass ich keinen Ort finde, offensichtlich, weil dies läuft, bevor der Benutzer eine Chance hat, auf OK zu tippen. Wenn ich die app und kommen zurück in Elave kann ich den Standort abrufen und auf der Karte hinzuzufügen. Ich möchte aber, wenn der Benutzer das erste Mal auf OK tippt, um dann den aktuellen Standort abrufen und dort und dort zur Karte hinzufügen zu können. Wie kann ich das erreichen? Ich habe das folgende Verfahren einen Stift für das Hinzufügen von:

func addPin(location2D: CLLocationCoordinate2D){ 
    self.mapView.delegate = self 
    var newPoint = MKPointAnnotation() 
    newPoint.coordinate = location2D 
    self.mapView.addAnnotation(newPoint) 
} 

Antwort

22

Um das zu tun, müssen Sie die Methode didChangeAuthorizationStatus für Ihren Standort Manager delegieren implementieren, die kurz genannt wird, nach CLLocationManager initialisiert wird.

Zunächst am Anfang der Datei nicht vergessen, hinzuzufügen: import CoreLocation

, das zu tun, in der Klasse, wo Sie den Speicherort verwenden, fügen Sie das Delegaten-Protokoll. Dann in der viewDidLoad Methode (oder applicationDidFinishLaunching wenn Sie in der AppDelegate sind) Ihren Standort-Manager initialisieren und legen Sie seine delegate Eigenschaft self:

class myCoolClass: CLLocationManagerDelegate { 
    var locManager: CLLocationManager! 

    override func viewDidLoad() { 
     locManager = CLLocationManager() 
     locManager.delegate = self 
    } 
} 

schließlich die Locationmanager implementieren (_ didChangeAuthorizationStatus _) Verfahren in den Körper Ihres Klasse, die Sie zuvor deklariert haben, wird diese Methode aufgerufen, wenn der Status der Berechtigung geändert wird, sobald Ihr Benutzer auf die Schaltfläche geklickt hat. Sie können es wie folgt implementieren:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     // If status has not yet been determied, ask for authorization 
     manager.requestWhenInUseAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     // If authorized when in use 
     manager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     // If always authorized 
     manager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // If restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // If user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

Swift 4 - Neue Enum Syntax

Für Swift 4, nur den ersten Buchstaben jedes Enum Fall wechseln in Kleinbuchstaben (.notDetermined, .authorizedWhenInUse, .authorizedAlways , .restricted und .denied)

diese Weise können Sie jeden Fall behandeln kann, ob der Benutzer nur noch die Erlaubnis gab, oder widerrufen sie.

+0

Danke für die Antwort. Die Zeile locManger.delegate = self gibt mir einen Fehler 'expected declaration' – user2363025

+0

@ user2363025 Kannst du das ausarbeiten? Klicken Sie auf den Fehler und es sollte Ihnen mehr sagen –

+0

Das ist der ganze Fehler sagt. Beim Schweben werden keine zusätzlichen Informationen angezeigt. Ich habe hier http://stackoverflow.com/questions/24121761/how-to-use-corelocation-with-swift gesehen, dass ich vielleicht locManager im appdelegate definieren soll? Ich bekomme auch Fehler in jedem Fall der switch-Anweisung sagen, dass jede der Methoden nicht ohne Argumente aufgerufen werden kann, ob ich den locManager in appdelegate oder meine View-Controller – user2363025