2017-09-14 2 views
0

Inside my ViewController's Klasse viewDidLoad Methode, die ich habe:MKMapItem.forCurrentLocation() gibt "Unknown Location"

override func viewDidLoad() { 
    super.viewDidLoad() 
    requestAuthorization() 
    locationManager.delegate = self 
    print(MKMapItem.forCurrentLocation()) 
} 

und hier ist requestAuthorization() Funktion:

private func requestAuthorization(){ 
    if CLLocationManager.authorizationStatus() == .notDetermined{ 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestWhenInUseAuthorization() 
    } 
    else if CLLocationManager.authorizationStatus() == .denied{ 
     //TODO 
    } 

} 

das Problem ist, dass forCurrentLocation() Funktion nie zurückkehrt Aktueller Benutzerort Die zurückgegebenen Koordinaten von MKMapItem sind: (Breitengrad: 0, Längengrad: 0). Hier ist das Ergebnis der Druckfunktion.

MKMapItem: 0x60000014e020 isCurrentLocation = 1; name = "Unbekannter Ort";

Was mache ich falsch?

Edit:

Der Grund, warum ich wollte MKMapItem.forCurrentLocation() verwenden war, dass ich geplant Benutzer in prepareForSegue bekommen koordiniert. Und ich dachte, es wäre einfacher als didUpdateLocations Delegate-Methode zu verwenden. Sehen Sie den Code:

if segue.identifier == "categories", 
     let destinationVC = segue.destination as? CategoriesGroupViewController{ 
     if let cell = sender as? UICollectionViewCell{ 
      let indexPath = categoriesCollectionView.indexPath(for: cell) 
      destinationVC.groupOfDestinations = destinationsByCategory[indexPath!.row] 
      // 0 is index for Near Me cell 
      if indexPath?.row == 0 { 
       destinationVC.groupOfDestinations = getNearMeDestinations() 
      } 

} 

private func getNearMeDestinations() -> GroupOfDestinations{ 
     let userCoordinates = MKMapItem.forCurrentLocation().placemark.coordinate 
     let nearMeCircularRegion: CLCircularRegion = CLCircularRegion(center: userCoordinates, radius: 10000, identifier: "nearMe") 
... 

     return nearMeDestinations 
    } 
+0

Verwenden Sie 'print (mapView.userLocation.location? .koordinate)' wenn Sie MKMapView in ViewController haben. –

Antwort

0
locationManager.desiredAccuracy = kCLLocationAccuracyBest 

über der Linie Setzen außerhalb wenn else-Block, wie

var locationManager: CLLocationManager? 

private func requestAuthorization(){ 

    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.delegate = self 

    if CLLocationManager.authorizationStatus() == .notDetermined{ 
     locationManager.requestWhenInUseAuthorization() 
    } 
    else if CLLocationManager.authorizationStatus() == .denied{ 
     //TODO 
    } 
} 

Es Delegatmethode für Karte ist, mit dem Sie aktuelle Lage gibt

// CLLocationManagerDelegate 
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    guard let location = locations.last else { 
     return 
    } 
    Print(location)// This is your current location 
} 
1

Sie tun nichts wro ng. MKMapItem.forCurrentLocation() Erstellt ein Singleton-Map-Objekt, das den aktuellen Standort des Geräts darstellt, und gibt es zurück.

MKMapItem.forCurrentLocation().isCurrentLocation ist ein boolescher Wert, der angibt, ob das Kartenelement den aktuellen Standort des Benutzers darstellt. In Ihrem Fall true.

MKMapItem.forCurrentLocation().name Der beschreibende Name, der dem Kartenelement zugeordnet ist. Wenn dieses Kartenelement den aktuellen Standort des Benutzers darstellt, wird der Wert in der Eigenschaft auf eine lokalisierte Version von "Aktueller Standort" gesetzt.

Und dass es zurückgibt Unbekannte Position ist seltsam. Aber es ist genug für Sie, um den Wert MKMapItem.forCurrentLocation().isCurrentLocation zu verfolgen.

Update:
Um die Benutzerstandorte zu erhalten koordinieren Sie wie folgt vor:

var location = CLLocation() 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    guard let latitude = manager.location?.coordinate.latitude, let longitude = manager.location?.coordinate.longitude else { return } 
    location = CLLocation(latitude: latitude, longitude: longitude) 
} 

Und dann Stelle verwenden, die auf dem neuesten Stand ist immer, wenn sich der Benutzer bewegt.

+0

Danke für die Antwort, es ein wenig geklärt, aber sehe meine Bearbeitung, sind die Koordinaten von MKMapItem immer (Latitude: 0, Länge: 0), auch wenn Location Manager Delegate tatsächlichen Benutzerstandort zurückgibt. –

+0

@barola_mes, verwenden Sie nicht 'MKMapItem', um den Benutzerstandort zu erhalten. Checkout meine Bearbeitung, wie es geht. –

+0

siehe meine Bearbeitung, ich war nicht zum ersten Mal –

Verwandte Themen