CLLocationCoordinates из locationManager didUpdateLocations

Я пытаюсь использовать CoreLocation (после предоставления разрешения), чтобы получить CLLocationCoordinate2D пользователя, чтобы я мог передать эту информацию в глубокую ссылку Uber (после нажатия кнопки UIButton в моем 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()
//            
}

person SamYoungNY    schedule 22.04.2015    source источник


Ответы (3)


Вы должны переместить var pickupLocation = coordinate! в свой didUpdateLocations. После назначения вы можете вызвать locationManager.stopUpdatingLocation() также изнутри 'didUpdateLocation или свое значение для координаты с постоянным обновлением. После остановки locationManager вызовите НОВУЮ функцию, чтобы запустить остальную часть вашего кода, находящегося в настоящее время в func uberButtonPressed.

person rmp    schedule 22.04.2015
comment
Привет, спасибо за ввод... Я попытался переместить pickupLocation в didUpdateLocations, и это сработало, я получаю координаты и правильно реализую stopUpdatingLocation(). Я немного смущен тем, что вы имеете в виду, вызывая НОВУЮ функцию для запуска остального кода в func uberButtonPressed... Вы имеете в виду, что я должен вынуть код (из uberButtonPressed) - начиная с var uber = Uber(pickupLocation :pickupLocation!), сделать отдельную функцию и потом вызывать её из didUpdateLocations? Я пробовал это, и pickupLocation по-прежнему равен нулю ... Проблема может заключаться в том, что uberButtonPressed запускается первым? - person SamYoungNY; 23.04.2015
comment
Да, это правильно, вы должны вызвать новую функцию после того, как вы остановили обновления своего местоположения. Новая функция будет включать код, начинающийся с var uber = Uber(pickupLocation: pickupLocation!). Вы можете либо передать pickupLocation новой функции, либо сделать pickupLocation свойством своего класса, чтобы его можно было прочитать из вашей новой функции после того, как ему будет присвоено значение в didUpdateLocation. - person rmp; 23.04.2015

У меня такая же проблема.

Вместо вызова метода делегата следующим образом:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    debugPrint("NOT CALLED-- didUpdateLocations AnyObject")    
}

Я превратился в:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    debugPrint("CALLED-- didUpdateLocations CLLocation")
}
person Mihriban Minaz    schedule 28.12.2016

Проблема в том, что вы разворачиваете coordinate, который является CLLocationCoordinate2D? с !. Поскольку координата взята из местоположения, которое является CLLocation?. Возможно, что координата равна нулю, а местоположение равно нулю, особенно до того, как службы определения местоположения успели включиться. Запустите остальную часть uberButtonPressed: только для случая, когда координата и местоположение не равны нулю, используя if let currentCoordinate = coordinate?, и в этом случае вызовите locationManager.stopUpdatingLocation().

person Josh Gafni    schedule 22.04.2015