Передача данных Google Мест на 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
    }()

2 ответа

Решение
self.placeNameLabel=UILabel()
if let name = selectedPlace as? String
{
   self.placeNameLabel.text = name
}

Вы должны назначить текст UILabel"s text имущество. UILabel отображает текст, но он делает гораздо больше, поэтому имеет больше атрибутов, таких как: backgroundColor, размер, рамка, границы и т. Д.
Таким образом, текстовая часть является лишь одним из многих свойств, которыми обладает UILabel, и вы должны явно указать это.
Кстати, вы можете удалить первую строку, если вы создали метку в раскадровке и подключили ее к розетке.

Кстати:
Это:

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

всегда возвращает истину, поэтому вы можете полностью забыть об этом.

Там нет необходимости для любого броска (и, конечно, не два). Просто сделайте:

self.placeNameLabel.text = place.name

Вы пытались присвоить строку метке. Вам необходимо назначить строку для текста метки.

Еще одна серьезная проблема. Вам нужно обновить метку внутри обработчика завершения lookUpPlaceID, Теперь у вас есть ярлык place параметр передается в метод контроллера представления, но вам нужно использовать place параметр передается в обработчик завершения lookupPlaceID метод. А поскольку обновление метки является действием пользовательского интерфейса, вы должны установить метку в главной очереди, используя 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()

}
Другие вопросы по тегам