2017-02-15 32 views
1

2つのセルを持つテーブルビューを作成しました。各セルにはあなたの上司とその両方の人が表示されます(あなたの場所に基づいています)。私はCLGeocoderを使用してユーザーの郵便番号を取得し、その値(文字列型)を関数外で宣言された変数に入れました。ユーザーの場所に基づいてデータを変更するにはどうすればよいですか?

理想的には、クラス内の別の関数に行き、その文字列変数(ユーザーの郵便番号を保持する)を使用して特定のデータを作成したいと考えています。しかし、それは動作しません! (私はプログラムを実行するときであれば条件で印刷機能が正常にターミナルで郵便番号を印刷していることに注意してください):ここでは

は、郵便番号を抽出し、VaRの郵便番号にそれを置くのコードです。

let locationManager = CLLocationManager() 

var zipcode: String = "" 

func getTableInfo() { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

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

     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 

     } 

     if placemarks!.count > 0 { 
      let pm = placemarks![0] 

      self.zipcode = pm.postalCode! 

      print(self.zipcode) 
     } 

     else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 

} 

私はviewDidLoad()でこの関数を呼び出した後、viewDidLoad()機能では、if文を使用して、私は文字列の配列を変更するために郵便番号を使用してみてください。 names[]は、viewDidLoad()関数のすぐ上の文字列の空の配列として宣言されます。

if zipcode == "94108" { 
     names[1] = "WORKS!" 
     print(names) 
    } 

何らかの理由で、名前が印刷されません。 (郵便番号は実際には94108です。なぜなら、「郵便番号」を印刷するように頼んだら、94108がコンソールに表示されるからです)

+0

== "94108"ステートメント?CLGeocoder関数がまだ終了していますか? – creeperspeak

+0

CLGeocoder()関数内に置くと正常に動作しますが、後でプログラムでnames []を印刷すると、names [1] doesn更新された要素を含めません。 –

+0

右しかし、 'reverseGeocode'は非同期関数なので、実行に若干の遅延があります。 if文を 'reverseGeocode'関数の直後に置くと、' reverseGeocode'がまだ動作しているので、ほぼ確実に ""なるでしょう。他の答えを見てください。 – creeperspeak

答えて

2

このように、あなたのgetTableInfoメソッドの完了ハンドラを作成します。

typealias ZipcodeCompletionBlock = (String?) -> Void 

func getTableInfo(completionBlock: @escaping ZipcodeCompletionBlock) { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

    CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in 
     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      completionBlock(nil) 
     } else if placemarks!.count > 0 { 
      let pm = placemarks![0] 
      self.zipcode = pm.postalCode! 
      completionBlock(self.zipcode) 
     } else { 
      print("Problem with the data received from geocoder") 
      completionBlock(nil) 
     } 
    }) 

} 

を今、あなたはのviewDidLoad内でこのように、この関数を呼び出すことができます:あなたは `場合は郵便番号を実行している

self.getTableInfo { zipcode in 
    if zipcode == "94108" { 
     self.names[1] = "WORKS!" 
     print(self.names) 
    } 
} 
0

これはおそらく、郵便番号を保存するコードの実行が少し遅れているためですあなたの印刷コードが実行されているときは、郵便番号はまだ ""です。完了したハンドラは、機能が完了した後にコードを実行するため、配置されています。印刷直後に次のコードを入力してください(自己.zipcode)

if zipcode == "94108" { 
    names[1] = "WORKS!" 
    print(names) 
} 

希望します。

+0

これで名前[]はコンソールに新しい出力を正常に表示しますが、なぜそれはgetTableInfo()内でのみ機能しますか?どのようにして異なる機能で正常に印刷できるようにすることができますか? –

+0

これらの関数を補完ブロックの内部から呼び出すと、郵便番号が正しく設定されたかどうかを知る唯一の方法です。 – Trev14

関連する問題