2017-09-14 191 views
0

里面我ViewController'sviewDidLoad方法,我有:MKMapItem.forCurrentLocation()返回 “未知位置”

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

这里是requestAuthorization()功能:

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

} 

问题是,forCurrentLocation()函数永远不会返回实际的用户位置返回MKMapItem的坐标是:(纬度:0,经度:0)。这是打印功能的结果。

MKMapItem:0x60000014e020 isCurrentLocation = 1; name =“未知位置”;

我在做什么错?

编辑:

我想用MKMapItem.forCurrentLocation()是,我打算让用户在prepareForSegue坐标的原因。我认为这比使用didUpdateLocations委托方法更容易。看到代码:

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

如果您在ViewController中有MKMapView,请使用print(mapView.userLocation.location?.coordinate)。 –

回答

0
locationManager.desiredAccuracy = kCLLocationAccuracyBest 

凌驾于线外的if else块,像

var locationManager: CLLocationManager? 

private func requestAuthorization(){ 

    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.delegate = self 

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

没有在地图的委托方法,它给你的当前位置

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

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

你没有做任何事情NG。 MKMapItem.forCurrentLocation()创建并返回一个表示设备当前位置的单例映射项目对象。

MKMapItem.forCurrentLocation().isCurrentLocation是一个布尔值,指示地图项是否表示用户的当前位置。在你的情况下true

MKMapItem.forCurrentLocation().name与地图项目关联的描述性名称。如果此地图项代表用户的当前位置,则属性中的值将设置为“当前位置”的本地化版本。

而且它返回未知位置很奇怪。但足以让你跟踪价值。

更新:
来获取用户的位置坐标做到以下几点:

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) 
} 

然后用这将永远是最新的,当用户移动位置。

+0

谢谢你的回复,澄清了一下,但是看到我的编辑,MKMapItem的坐标总是(纬度:0,经度:0),即使位置管理器委托返回实际的用户位置。 –

+0

@barola_mes,不要使用'MKMapItem'来获取用户位置。检查我的编辑如何做到这一点。 –

+0

请看我的编辑,我第一次没有明确表示 –