CLLocationCoordinates from locationManager didUpdateLocations
Я пытаюсь использовать CoreLocation (после предоставления разрешения), чтобы получить пользовательский CLLocationCoordinate2D, чтобы я мог передать эту информацию в глубокую ссылку Uber (после нажатия кнопки UIB внутри моего TableView).
Я выяснил, как получить координаты в виде CLLocations и превратить их в CLLocationCoordinates2D в методе didUpdateLocations, но не могу передать их в мою функцию buttonPressed.
Может кто-нибудь объяснить, как я могу правильно передать информацию о координатах в метод uberButtonPressed? Я также не совсем понимаю, как заставить locationManager прекратить обновление местоположения после определения подходящего местоположения. Буду признателен за любую оказанную помощь. Кстати, я использую это для создания экземпляра Uber: https://github.com/kirby/uber
import UIKit
import CoreLocation
import MapKit
class ATableViewController: UITableViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var location: CLLocation?
var coordinate: CLLocationCoordinate2D?
// Implemented tableView methods etc here...
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
let newLocation = locations.last as! CLLocation
println("DID UPDATE LOCATIONS \(newLocation)")
location = newLocation
coordinate = location!.coordinate
println("WE HAVE THE COORDINATES \(coordinate!.latitude) and \(coordinate!.longitude)") // this prints along with DID UPDATE LOCATIONS
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("error:" + error.localizedDescription)
}
func uberButtonPressed(sender: UIButton!) {
let senderButton = sender
println(senderButton.tag)
let authStatus: CLAuthorizationStatus = CLLocationManager.authorizationStatus()
if authStatus == .NotDetermined {
locationManager.requestWhenInUseAuthorization()
return
}
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
}
var pickupLocation = coordinate! // fatal error: unexpectedly found nil while unwrapping an Optional value
println(pickupLocation)
// // Create an Uber instance
// var uber = Uber(pickupLocation: pickupLocation)
//
// Set a few optional properties
// uber.pickupNickname = "OK"
//
// uber.dropoffLocation = CLLocationCoordinate2D(latitude: 47.591351, longitude: -122.332271)
// uber.dropoffNickname = "whatever"
//
// // Let's do it!
// uber.deepLink()
//
}
3 ответа
Вы должны двигаться var pickupLocation = coordinate!
в ваш didUpdateLocations
, После назначения вы можете позвонить locationManager.stopUpdatingLocation()
также изнутри 'didUpdateLocation
или ваше значение для координаты с обновлением. После остановки locationManager вызовите НОВУЮ функцию для запуска остальной части вашего кода, который в данный момент находится в func uberButtonPressed
У меня такая же проблема.
Вместо вызова метода делегата вот так:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
debugPrint("NOT CALLED-- didUpdateLocations AnyObject")
}
Я изменился в:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
debugPrint("CALLED-- didUpdateLocations CLLocation")
}
Проблема в том, что вы разворачиваете coordinate
который является CLLocationCoordinate2D?
с !
, Так как координата от местоположения, которое является CLLocation?
, Возможно, что координата равна нулю, а местоположение равно нулю, особенно до того, как у служб определения местоположения появится шанс. Только запустить остальные uberButtonPressed:
для случая, когда координата и местоположение не равны нулю, используя if let currentCoordinate = coordinate?
и в этом случае позвоните locationManager.stopUpdatingLocation()
,