2016-03-30 8 views
0

ユーザーの現在の場所を取得する独自の構造体またはクラスを作成したいとします。Swift - 現在の場所の構造体/クラス(CLLocationManager)

私はCLLocationManagerを使用することができず、構造体の中に関数(didUpdateLocations、didFailWithErrorなど)があるようです(Xcodeはすべてのテキストカラーを黒にして、An internal error occurred. Source editor is limited.というエラーが発生します)。クラスを使用して "getPlacemark"ファンクション(インスタンス化されたクラスから目印を取得する)を使用するか、作成されたインスタンス(instancedClass.placemarkInClass)から直接取得するだけで何も動作しない場合、私はThread 1: EXC_BAD_ACCESS

これは、クラスを作成する方法の私の最後の試みです:私のViewControllerで

import Foundation 
import MapKit 

class UserLocation: NSObject, CLLocationManagerDelegate{ 

    var mLocationManager: CLLocationManager 
    var placemark: CLPlacemark 

    override init(){ 
     placemark = CLPlacemark() 
     self.mLocationManager = CLLocationManager() 
     self.mLocationManager.desiredAccuracy = kCLLocationAccuracyBest 
     self.mLocationManager.requestWhenInUseAuthorization() 
     self.mLocationManager.startUpdatingLocation() 
    } 

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

     CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error) -> Void in 

      if (error != nil) { 
       print("Error: " + (error?.localizedDescription)!) 
       return 
      } 
      if (placemarks?.count > 0) { 
       let pm = placemarks![0] 
       self.placemark = pm 
       print(self.placemark.areasOfInterest) 
       self.mLocationManager.stopUpdatingLocation() 
      } 

     }) 

    } 

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
     print("Error: " + (error.localizedDescription)) 
    } 

    func getPlacemark() -> CLPlacemark{ 
     return self.placemark 
    } 

} 

私はインスタンス変数作る(currentLocation = CurrentLocation())との両方

を使用するようにしてくださいuserPlacemark = currentLocation.getPlacemark() と をuserPlacemark = currentLocation.placemark にしましょう。何も問題はありません。

現在の場所をフェッチして他のViewControllerで使用するための独自のクラスまたは構造体を持つ方法はありますか?

答えて

1

あなたのコードを持つ2つの観測があります

  1. あなたはメンバ変数を設定し終えたら、あなたはあなたのinitで[スーパーのinit]を呼び出していません。あなたにinitを変更する

     init(){ 
    
         placemark = CLPlacemark() 
    
         mLocationManager = CLLocationManager() 
         mLocationManager.desiredAccuracy = kCLLocationAccuracyBest 
         mLocationManager.requestWhenInUseAuthorization() 
         mLocationManager.startUpdatingLocation() 
         super.init() 
         mLocationManager.delegate = self 
         } 
    
  2. ロケーションマネージャの代理人を設定してください。 Location Managerのインスタンスを作成した直後に、initでこれを行う必要があります。上記のinitコードを参照してください。

+0

私が使用するときは、自分自身がsuper.init call_の前に使用されます。しかし、問題は私が場所を受け取ることができないということです。 getPlacemarkメソッドを使用しようとすると、場所が設定されません。私は[OneShotLocationManager](https://github.com/icanzilb/OneShotLocationManager)を使用しようとしましたが、動作しません。それは私が作りたいと思うようなクラスです。私は答えを与えるチュートリアルやSOの投稿を見つけることができないようです。 –

+0

init()はこれで動作します、ありがとう! –