1

MKMapViewデリゲート メソッドを呼び出すことができませんdidUpdateUserLocation

私がこれまでにやったこと:

  1. MapKit.framworkプロジェクトにフレームワークを追加

  2. import MapKitフレームワークをView Controllerに1行ずつインポートする

  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値の型は文字列です。

試す:

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

他の回答に加えて、ここで要約したいと思います。

にキーを入れましNSLocationAlwaysUsageDescriptioninfo.plist。そのvalueキーの は、ユーザーがシステムから位置情報サービスの許可を求めるように求められたときの質問のテキストを含む文字列である必要があります。

キーに従って、呼び出して許可を要求する必要があります

locationManager.requestWhenInUseAuthorization()

あなたはおそらく質問に答えているかもしれないので、あなたの答えはすでにユーザー設定に保存されているかもしれません. 最善の方法は、シミュレーターからアプリを完全にアンインストールして再インストールすることです。これにより、再度尋ねられます。

于 2014-12-03T10:37:13.427 に答える
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];


UtilSingleton のコードは、一般的にコントローラー ビューに追加できるため、MapView を Window に追加します。

于 2016-05-24T08:16:51.370 に答える
0

上記のすべての回答を試した後、「didUpdateUserLocation」デリゲートが呼び出されていない場合は、シミュレーターを選択し、メニュー バーから [デバッグ] をクリックして [場所] を選択し、[Apple] を選択します。何よりも答えを試してみましたが、場所はカスタムに設定されていたので、Appleに変更してデリゲートメソッドを呼び出しました。その後、再びカスタムに設定し、場所を表示しています。

于 2017-01-03T13:28:58.717 に答える