将 Google Places 数据传递给 UILabel



我正在尝试传递从GMSAutocompleteViewController中选择位置后收集的数据,但遇到了一些问题。我收到此错误:无法将类型"NSTaggedPointerString"(0x1afeb5c50(的值转换为"UILabel"(0x1afedd508(。不知道我做错了什么...感谢您的任何帮助!

    // 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
    }()
不需要

任何演员(当然也不需要两个(。只需做:

self.placeNameLabel.text = place.name

您正在尝试将字符串分配给标签。您需要将字符串分配给标签的文本。

另一个严重的问题。您需要更新 lookUpPlaceID 的完成处理程序中的标签。就像现在一样,将标签设置为传递给视图控制器方法的place参数,但需要使用传递给lookupPlaceID方法的完成处理程序的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()
}
self.placeNameLabel=UILabel()
if let name = selectedPlace as? String
{
   self.placeNameLabel.text = name
}

您必须将文本分配给UILabeltext属性。UILabel确实显示文本,但它的功能远不止于此,因此它具有更多属性,例如:背景颜色,大小,框架,边界等。
因此,文本部分只是 UILabel 具有的众多属性之一,您必须显式指定它。
顺便说一句,如果您在情节提要中创建标签并将其与插座连接,则可以删除第一行。

顺便一提:
这:

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

始终返回 true,因此您可以完全忘记它。

相关内容

  • 没有找到相关文章

最新更新