2017-03-20 6 views
1

GMSAutocompleteViewControllerから場所を選択していくつかの問題が発生した後に収集されたデータを渡そうとしています。私はこのエラーが発生しています:タイプ 'NSTaggedPointerString'(0x1afeb5c50)の値を 'UILabel'(0x1afedd508)にキャストできませんでした。私が間違っていることを確信していない...すべての助けてくれてありがとう!GoogleプレイスのデータをUILabelに渡します

// MARK: GOOGLE AUTO COMPLETE DELEGATE 

    func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { 

     // Do something with the selected place. 
     // A hotel in Saigon with an attribution. 
     // let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs" 
     let placeID = place.placeID 

     placesClient.lookUpPlaceID(placeID, callback: { (place, error) -> Void in 
      if let error = error { 
       print("lookup place id query error: \(error.localizedDescription)") 
       return 
      } 

      guard let place = place else { 
       print("No place details for \(placeID)") 
       return 
      } 

      print("Place name \(place.name)") 
      print("Place address \(place.formattedAddress)") 
      print("Place placeID \(place.placeID)") 
      print("Place attributions \(place.attributions)") 
     }) 

     // 
     let selectedPlace = place.name 
     self.placeNameLabel = (selectedPlace as AnyObject) as! UILabel 

     self.dismiss(animated: true, completion: nil) 
     setupConfirmationPopUp() 

    } 


// label I am trying to pass the place.name to 
    lazy var placeNameLabel: UILabel = { 
     let placeNameLabel = UILabel() 
     placeNameLabel.textColor = .black 
     placeNameLabel.text = "Are you sure you want to add < Placename Placename > to places you have visited?" 
     placeNameLabel.frame = CGRect(x: 50, y: 120, width: 200, height: CGFloat.greatestFiniteMagnitude) // use constraints later 
     placeNameLabel.numberOfLines = 0 
     placeNameLabel.lineBreakMode = NSLineBreakMode.byWordWrapping 
     placeNameLabel.sizeToFit() 
     placeNameLabel.layer.zPosition = 1 
     placeNameLabel.isUserInteractionEnabled = true 
     return placeNameLabel 
    }() 

答えて

0
self.placeNameLabel=UILabel() 
if let name = selectedPlace as? String 
{ 
    self.placeNameLabel.text = name 
} 

あなたはUILabeltextプロパティにテキストを割り当てる必要があります。 UILabelはテキストを表示しますが、それ以上のことがありますので、backgroundColor、size、frame、boundsなどの属性があります。
したがって、テキスト部分はUILabelの持つ多くのプロパティの1つで、明示的に指定します。
ストーリーボードにラベルを作成し、それをコンセントに接続した場合は、最初の行を削除できます。ところで


この:

guard let place = place else { 
    print("No place details for \(placeID)") 
    return 
} 

は常にtrueを返しますので、あなたは完全にそれを忘れることができます。

1

キャストは必要ありません(確かに2つではありません)。単純に:

self.placeNameLabel.text = place.name 

ラベルに文字列を割り当てようとしました。文字列をラベルのテキストに割り当てる必要があります。

その他の重大な問題が1つあります。完了ハンドラ内のラベルをlookUpPlaceIDに更新する必要があります。今のように、表示コントローラメソッドに渡されたplaceパラメータにラベルを設定しましたが、メソッドの完了ハンドラに渡されるplaceパラメータを使用する必要があります。ラベルの更新はUIアクションなので、DispatchQueue.main.asyncを使用してメインキューのラベルを設定する必要があります。

func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { 
    let placeID = place.placeID 

    placesClient.lookUpPlaceID(placeID, callback: { (place, error) -> Void in 
     if let error = error { 
      print("lookup place id query error: \(error.localizedDescription)") 
      return 
     } 

     guard let place = place else { 
      print("No place details for \(placeID)") 
      return 
     } 

     print("Place name \(place.name)") 
     print("Place address \(place.formattedAddress)") 
     print("Place placeID \(place.placeID)") 
     print("Place attributions \(place.attributions)") 

     DispatchQueue.main.async { 
      self.placeNameLabel = place.name 
     } 
    }) 

    self.dismiss(animated: true, completion: nil) 
    setupConfirmationPopUp() 

} 
関連する問題