2015-06-19 10 views
9

Sto tentando di implementare una visualizzazione di base della mappa e di aggiungere la posizione corrente dell'utente alla mappa come annotazione. Ho aggiunto la chiave requestwheninuse al mio info.plist e importato CoreLocation.Gestione istantanea delle autorizzazioni di posizione in rapido

Nel metodo load fatto del mio controller della vista, ho le seguenti:

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 
} 

Sto ottenendo il re pronta. permesso di recuperare la posizione. Mentre questo sta accadendo, sto ricevendo la mia stampa dicendo di non ottenere la posizione, ovviamente perché questo funziona prima che l'utente abbia la possibilità di toccare OK. Se elascio l'app e torno indietro, posso recuperare la posizione e aggiungerla alla mappa. Tuttavia, voglio quando l'utente tocca OK la prima volta per essere in grado di afferrare la posizione corrente e aggiungerla alla mappa lì e poi. Come posso raggiungere questo obiettivo? Ho il seguente metodo per l'aggiunta di un perno:

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

risposta

22

Per fare questo, è necessario implementare il metodo didChangeAuthorizationStatus per il responsabile delegato che viene chiamato poco dopo CLLocationManager viene inizializzato.

In primo luogo, nella parte superiore del file non dimenticate di aggiungere: import CoreLocation

Per farlo, nella classe in cui si utilizza la posizione, aggiungere il protocollo delegato. Poi nel metodo viewDidLoad (o applicationDidFinishLaunching se si è nel AppDelegate) inizializzare il location manager e impostare la sua delegate proprietà self:

class myCoolClass: CLLocationManagerDelegate { 
    var locManager: CLLocationManager! 

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

Infine, implementare il locationManager (_ didChangeAuthorizationStatus _) metodo nel corpo del vostro classe che hai dichiarato in precedenza, questo metodo verrà chiamato quando lo stato dell'autorizzazione viene modificato, quindi non appena l'utente ha fatto clic sul pulsante. È possibile implementare in questo modo:

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 - Nuova enum sintassi

Per Swift 4, basta passare la prima lettera di ogni caso enum in minuscolo (.notDetermined, .authorizedWhenInUse, .authorizedAlways , .restricted e .denied)

In questo modo è possibile gestire ogni caso, se l'utente ha appena dato il suo consenso o lo ha revocato.

+0

Grazie per la risposta. La riga locManger.delegate = self mi sta dando un errore 'dichiarazione prevista' – user2363025

+0

@ user2363025 puoi elaborare? Clicca sull'errore e dovrebbe dirti di più –

+0

Questo è tutto ciò che dice l'errore. Nessuna informazione aggiuntiva sta spuntando al passaggio del mouse. Ho visto qui http://stackoverflow.com/questions/24121761/how-to-use-corelocation-with-swift che forse dovrei definire locManager in appdelegate? Ricevo anche errori in ogni caso dell'istruzione switch dicendo che ognuno dei metodi non può essere chiamato senza argomenti se ho definito il locManager in appdelegate o il mio controller di vista – user2363025