使用GMSAutocomplete显示城市和州-Swift

时间:2019-02-09 16:34:22

标签: swift google-maps google-places-api google-places googleplacesautocomplete

我有一个GMSAutocompleteViewController,它在按下按钮后显示。代码如下:

 let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self

    let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
        UInt(GMSPlaceField.placeID.rawValue))!
    autocompleteController.placeFields = fields

    let filter = GMSAutocompleteFilter()
    filter.type = .geocode
    filter.country = "US"
    autocompleteController.autocompleteFilter = filter

    present(autocompleteController, animated: true, completion: nil)

当用户搜索时,来自视图控制器的结果如下:

enter image description here

并使用此代码,我可以返回该地点的名称以及格式化的地址和属性:

func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(place.name)")
    print("Formatted address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
    dismiss(animated: true, completion: nil)
}

打印出-> 地名:Tremosine 格式化的地址:无 位置归因:无

我要返回的是屏幕截图中的第二行,上面写着“意大利布雷西亚省”,这样我就可以将其存储在后端。对如何获取该文本有任何想法吗?

2 个答案:

答案 0 :(得分:0)

我找到了解决该问题的方法,并且为此使用了singleton类。

class GoogleLocation {

    var lat, lng: Double?
    var city, state, country, name: String?

    func extractFromGooglePlcae(place: GMSPlace) -> GoogleLocation {
        self.lat = place.coordinate.latitude
        self.lng = place.coordinate.longitude
        self.city = place.name!
        self.state = place.addressComponents?.first(where: { $0.type == "administrative_area_level_1" })?.name
        self.country = place.addressComponents?.first(where: { $0.type == "country" })?.name
        self.name = self.getFullName()


        return self
    }

    private func getFullName() -> String {
        //return "\(String(describing: self.city)), \(String(describing: self.state)), \(String(describing: self.country))"
        return self.city! + ", " + self.state! + ", " + self.country!
    }
}

在viewController中,您应该传递place对象。

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

          googleLocation = GoogleLocation().extractFromGooglePlcae(place: place)

        }

让我知道您是否对此有任何疑问。 谢谢

答案 1 :(得分:0)

您必须使用 addressComponents 值来获取格式化的地址。

let autocompleteController = GMSAutocompleteViewController()
autocompleteController.delegate = self
let fields: GMSPlaceField = GMSPlaceField(rawValue: 
  UInt(GMSPlaceField.formattedAddress.rawValue) |
            UInt(GMSPlaceField.addressComponents.rawValue))!
autocompleteController.placeFields = fields

let filter = GMSAutocompleteFilter()
filter.type = .geocode
filter.country = "US"
autocompleteController.autocompleteFilter = filter

present(autocompleteController, animated: true, completion: nil)