1

我无法调用MKMapView委托方法didUpdateUserLocation

到目前为止我做了什么:

  1. MapKit.framwork在项目中添加框架

  2. import MapKit在视图控制器中逐行导入框架

  3. 在 plist 文件中添加密钥

    <key>NSLocationAlwaysUsageDescription</key> <true/>

  4. 视图控制器中的代码

添加了检查位置的委托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 键

在此处输入图像描述

也没有提示权限警报。

4

6 回答 6

4
  1. 您必须保留对CLLocationManager.
  2. 您必须在和locationManager(_:didChangeAuthorizationStatus:)之前等待调用的委托方法。.startUpdatingLocation()showsUserLocation = true
  3. 根据文档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
    }

}
于 2014-12-03T10:37:44.273 回答
2

除了其他答案,我想在这里总结一下:

你已经把钥匙NSLocationAlwaysUsageDescription放在你的info.plist. 当系统提示用户请求位置服务权限时,value该键的 必须是包含问题文本的字符串。

根据密钥,您必须通过调用请求权限

locationManager.requestWhenInUseAuthorization()

您可能已经回答了该问题,因此您的答案可能已经保存在用户首选项中。最好的方法是从模拟器中完全卸载应用程序并重新安装它,以便再次询问您。

于 2014-12-03T10:37:13.427 回答
1

对于在 iOS 8 上运行的应用程序,您需要在 plist 文件中添加两个键:

NSLocationAlwaysUsageDescription(你已经有了这个)

NSLocationWhenInUseUsageDescription

此外,您还需要检查应用程序是否在 iOS8 下运行,如果是,请添加以下两行。如果是 iOS 7 或更低版本,则需要跳过这两行。如果您忘记执行此操作,应用程序将在较低版本上崩溃。

// You have this check
locationManager.requestWhenInUseAuthorization()
// Add this one
locationManager.requestAlwaysAuthorization()
于 2014-12-03T10:25:31.777 回答
1

问题是您要求何时使用授权

locationManager.requestWhenInUseAuthorization()

在 pList 中,您添加<key>NSLocationAlwaysUsageDescription</key>的是始终授权。您需要使用NSLocationWhenInUseUsageDescription密钥

于 2014-12-03T10:25:58.317 回答
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 中的代码,您通常可以添加到您的控制器视图中。

于 2016-05-24T08:16:51.370 回答
0

在尝试了以上所有答案后,如果没有调用“didUpdateUserLocation”委托,则选择模拟器,从菜单栏中单击“调试”,选择“位置”,然后选择“Apple”。我首先尝试了答案,但位置设置为自定义,所以我将其更改为 Apple 并调用了委托方法。之后,我再次将其设置为自定义,现在它正在显示位置。

于 2017-01-03T13:28:58.717 回答