我无法拨打MKMapView
委托方法didUpdateUserLocation
。
到目前为止我做了什么:
在项目中添加框架MapKit.framwork
通过import MapKit
行
在plist文件中添加密钥
<key>NSLocationAlwaysUsageDescription</key>
<true/>
视图控制器中的代码
添加了委托didUpdateUserLocation
方法来检查位置是否已更新但从未调用过。
// MARK: - MapView delegate methods
func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) {
// Calling...
}
func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
// Not getting called
}
// MARK: - View lifeCycle methods
override func viewDidLoad() {
super.viewDidLoad()
var locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
self.mapView.delegate = self
self.mapView.showsUserLocation = true
self.mapView.pitchEnabled = true
self.mapView.showsBuildings = true
}
我使用过模拟器并更改模拟器自定义位置来检查它是否被调用?方法regionDidChangeAnimated
被称为完美!。
同样适用于iOS7。 Swift地图位置更新还有哪些额外的工作?
编辑:Plist键
也未提示权限提示。
答案 0 :(得分:4)
CLLocationManager
。locationManager(_:didChangeAuthorizationStatus:)
和.startUpdatingLocation()
之前等待showsUserLocation = true
委托方法。NSLocationWhenInUseUsageDescription
值类型为String。尝试:
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
// MARK: - View lifeCycle methods
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestWhenInUseAuthorization()
self.mapView.delegate = self
self.mapView.pitchEnabled = true
self.mapView.showsBuildings = true
}
// MARK: - LocationManager delegate methods
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .Authorized, .AuthorizedWhenInUse:
manager.startUpdatingLocation()
self.mapView.showsUserLocation = true
default: break
}
}
// MARK: - MapView delegate methods
func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
println(userLocation)
// Not getting called
}
}
答案 1 :(得分:2)
除了我想在此总结的其他答案:
您已将密钥NSLocationAlwaysUsageDescription
放入info.plist
。当系统提示用户请求位置服务权限时,该密钥的value
必须是字符串,其中包含问题的文本。
根据密钥,您必须致电
申请许可locationManager.requestWhenInUseAuthorization()
您可能已经回答了问题,因此您的答案可能已保存在用户首选项中。最好的方法是从模拟器中完全卸载应用程序并重新安装,以便再次询问。
答案 2 :(得分:1)
对于在iOS 8上运行的应用程序,您需要在plist文件中添加两个键:
NSLocationAlwaysUsageDescription(你已经有了这个)
NSLocationWhenInUseUsageDescription
此外,您还需要检查应用程序是否在iOS8下运行,如果是,请添加以下两行。如果是iOS 7或以下,则需要跳过这两行。如果您忘记这样做,应用程序将在较低版本上崩溃。
// You have this check
locationManager.requestWhenInUseAuthorization()
// Add this one
locationManager.requestAlwaysAuthorization()
答案 3 :(得分:0)
问题在于您要求何时使用授权
locationManager.requestWhenInUseAuthorization()
并在pList中添加<key>NSLocationAlwaysUsageDescription</key>
,用于始终授权。您需要使用NSLocationWhenInUseUsageDescription
密钥
答案 4 :(得分:0)
修好了!
ios8后MKMapView没有自动加载LocationCoordinate。 如果我们想使用MKMapView使用“-mapView:didUpdateUserLocation”加载更准确的位置:
<强>前提:强> 1.设置mapView委托。 2.setShowsUserLocation:YES 3.mapView必须在一个容器中(addSubview:mapView)!!!!!
示例:
self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
_mapView.delegate = self;
[_mapView setShowsUserLocation:YES];
[[UIApplication sharedApplication].keyWindow addSubview:_mapView];
我将MapView添加到Window,因为UtilSingleton中的代码一般可以添加到控制器视图中。
答案 5 :(得分:0)
尝试上述所有答案后,如果“didUpdateUserLocation”委托未被调用,则选择模拟器,单击Debug from菜单栏选择Location,然后选择Apple。我尝试了上面的所有答案,但位置设置为自定义,所以我将其更改为Apple和委托方法调用。之后,我再次将其设置为自定义,现在显示位置。