web-dev-qa-db-ja.com

swift

基本的なマップビューを実装し、ユーザーの現在の場所を注釈としてマップに追加しようとしています。 info.plistにrequestwheninuseキーを追加し、coreLocationをインポートしました。

私のView Controllerのdid loadメソッドには、以下があります:

locManager.requestWhenInUseAuthorization()
var currentLocation : CLLocation

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){

    currentLocation = locManager.location
    println("currentLocation is \(currentLocation)")      
}
else{
    println("not getting location")
    // a default pin
}

プロンプトを再取得しています。場所を取得する権限。これが発生しているため、ユーザーが[OK]をタップする機会が得られる前に実行されるため、場所を取得できないというメッセージが表示されます。アプリを起動して戻ってきたら、場所を取得して地図に追加できます。ただし、ユーザーが最初に[OK]をタップしたときに、現在の場所を取得して地図に追加できるようにする必要があります。どうすればこれを達成できますか?ピンを追加するには、次の方法があります。

func addPin(location2D: CLLocationCoordinate2D){
    self.mapView.delegate = self
    var newPoint = MKPointAnnotation()
    newPoint.coordinate = location2D
    self.mapView.addAnnotation(newPoint)
}
16
user2363025

そのためには、didChangeAuthorizationStatusが初期化された直後に呼び出されるロケーションマネージャーデリゲートのmethodCLLocationManagerを実装する必要があります。

まず、ファイルの先頭に追加することを忘れないでください:_import CoreLocation_

これを行うには、場所を使用しているクラスにデリゲートプロトコルを追加します。次に、viewDidLoadメソッド(またはapplicationDidFinishLaunchingを使用している場合はAppDelegate)でロケーションマネージャを初期化し、そのdelegateプロパティをselfに設定します。

_class myCoolClass: CLLocationManagerDelegate {
    var locManager: CLLocationManager!

    override func viewDidLoad() {
        locManager = CLLocationManager()
        locManager.delegate = self
    }
 }
_

最後に、前に宣言したクラスの本体にlocationManager(_didChangeAuthorizationStatus__)メソッドを実装します。このメソッドは、ユーザーがボタンをクリックするとすぐに、承認のステータスが変更されたときに呼び出されます。次のように実装できます。

_private func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        // If status has not yet been determied, ask for authorization
        manager.requestWhenInUseAuthorization()
        break
    case .authorizedWhenInUse:
        // If authorized when in use
        manager.startUpdatingLocation()
        break
    case .authorizedAlways:
        // If always authorized
        manager.startUpdatingLocation()
        break
    case .restricted:
        // If restricted by e.g. parental controls. User can't enable Location Services
        break
    case .denied:
        // If user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    }
}
_

Swift 4-新しい列挙型構文

Swift 4の場合、各列挙型の大文字の最初の文字を小文字に切り替えます(.notDetermined、.authorizedWhenInUse、.authorizedAlways、.restrictedおよび.denied)

そうすれば、ユーザーが許可を与えるか取り消すだけで、すべてのケースを処理できます。

38
The Tom