2015-07-14 3 views
0

Я только что начал с быстрой, и у меня возникла проблема. Я прочитал различные темы о местонахождении пользователя и наборах карт и не могу решить мою проблему. У меня был код, и я мог создавать регионы по своему усмотрению, и я мог бы увеличить его местоположение.Swift - проблемы с местоположением пользователя

Я вернул код обратно, чтобы попытаться найти проблему, а оставшийся код ниже. Проблема в том, что пользовательская позиция возвращается как значение nil, когда вы пытаетесь запустить симулятор, который вызывает сбой приложения. Что я делаю неправильно, так как я завершил авторизацию местоположения пользователя, поэтому он не должен возвращаться в нуль. В какой-то момент у меня был код для увеличения местоположения пользователя ПОСЛЕ первоначальной настройки региона в другом месте и вызова функции для масштабирования, но если вы сначала попытаетесь вызвать местоположение пользователя, то всегда всегда ноль, чтобы вы не могли инициализировать масштабирование карты в где пользователь - это то, что я хочу.

import UIKit 
import MapKit 

class MapController: UIViewController, CLLocationManagerDelegate { 

@IBOutlet weak var mapView: MKMapView! 

// MARK: - location manager to authorize user location for Maps app 

var locationManager = CLLocationManager() 

func checkLocationAuthorizationStatus() { 
    if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse { 
     mapView.showsUserLocation = true 
    } else { 
     locationManager.requestWhenInUseAuthorization() 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    checkLocationAuthorizationStatus() 

    var userLocation = locationManager.location 

    println("\(userLocation.coordinate.latitude)") 

    println("\(userLocation.coordinate.longitude)") 

    // Do any additional setup after loading the view. 
    } 

} 

ответ

1

Во-первых, CLLocationManager обновления местоположения пользователя асинхронно. Это означает, что даже после того, как вы позвоните startUpdatingLocation(), ваше местоположение будет nil, пока менеджер местоположений не вернется с новым местоположением.

Во-вторых, в вашем коде вы фактически не вызываете этот метод. Если вам не нужно, чтобы иметь возможность сохранить местоположение пользователя, то вы должны изменить свой код:

import UIKit 
import MapKit 

class MapController: UIViewController, CLLocationManagerDelegate { 

@IBOutlet weak var mapView: MKMapView! 

// MARK: - location manager to authorize user location for Maps app 

lazy var locationManager: CLLocationManager = { 
    var manager = CLLocationManager() 
    manager.delegate = self 
    return manager 
}() 

func checkLocationAuthorizationStatus() { 
    if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse { 
     mapView.showsUserLocation = true 
     locationManager.startUpdatingLocation() 
    } else { 
     locationManager.requestWhenInUseAuthorization() 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    checkLocationAuthorizationStatus() 

    //location is nil at this point because location update is 
    //an asynchronous operation! 
    //var userLocation = locationManager.location 

    //println("\(userLocation.coordinate.latitude)") 

    //println("\(userLocation.coordinate.longitude)") 

    // Do any additional setup after loading the view. 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let location = locations.last { 
     //this is the place where you get the new location 
     println("\(location.coordinate.latitude)") 

     println("\(location.coordinate.longitude)") 
    } 
} 

Существует только одна незначительная вещь, чтобы отметить. В последней функции я использую аргумент locations: [CLLocation]. Это определенно верно в Swift 2.0, но в Swift 1.2 это может быть locations: [AnyObject], и в этом случае вы должны сделать условное понижение самостоятельно.

Позвольте мне знать, если это работает для вас

+0

я понял, что система буквально не было времени, чтобы найти место и фиксируют его. Спасибо хоть. –

+1

@BradHoult, если вам нужно получить доступ к местоположению пользователя через 'CLLocationManager', вы не должны полагаться на предположение, что для поиска пользователя требуется X секунд. Это, безусловно, приведет к сбоям, поскольку время, необходимое для поиска пользователя, зависит от многих вещей, которые вы не можете контролировать. Поэтому я настоятельно рекомендую вам использовать мое предложение. Однако, если все, что вам нужно достичь, - это найти пользователя на вашей карте, тогда «mapView.showsUserLocation» достигнет того, чего вы хотите, и вы правы - ему просто нужно некоторое время :) –

+0

Я сделал это совершенно по-другому , как вы увидите, если вы ответите на мой следующий вопрос здесь :-) –

Смежные вопросы