我正在使用Google Maps iOS SDK,并想存储用户搜索的近期地点(GMSPlace
对象)。我在检索这些位置时遇到了问题,因为GMSPlace
似乎无法直接实例化。
可以实例化GMSPlace对象吗?
谢谢!
最佳答案
创建GMS位置实例
是的,您可以实例化GMS放置对象。在互联网上查询的那天,我遇到了您的问题,希望找到答案,但没有找到答案。
因此,我想出了自己的解决方案。以下是创建GMSPlace实例的方法。
因此,我的要求是将3个GMS位置存储在3个不同的GMSPlace变量中。这是我所做的:
var currentLocation: GMSPlace?
var selectedFromDestination: GMSPlace?
var selectedToDestination: GMSPlace?
现在,currentLocation将存储用户的当前位置,selectedFromDestination将存储起始地址点,而selectedToDestination将存储目标地址点。
注意:请注意,它们都是可选的。这是我唯一可以使用的工具,因为我还是Swift的菜鸟。
//MARK:- FUNCTION FOR GETTING CURRENT LOCATION
func getCurrentPlace() {
placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in
if let error = error {
print("Pick Place error: \(error.localizedDescription)")
return
}
if let placeLikelihoodList = placeLikelihoodList {
let place = placeLikelihoodList.likelihoods.first?.place
if let place = place {
self.nameLabel.text = place.name + "\(place.coordinate.latitude) , \(place.coordinate.longitude)"
self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
.joined(separator: "\n")
//assigning returned GMSPlace place object to currentlocation
self.currentLocation = place
}
}
})
}
现在,在我的
viewDidLoad()
方法中,我调用了此函数getCurrentPlace()
,该函数随后将获取用户的当前位置并将其存储在currentLocation
变量中。现在,您可以在ViewController中的任何位置访问此变量,并访问其属性,例如
currentLocation?.formattedAddress
currentLocation?.coordinate.latitude
currentLocation?.coordinate.longitude
等等。
现在,如果您要存储用户选择的取件地址和目的地地址,例如,请继续阅读以下内容:-)
哦,好了,现在您有两个文本字段需要打开GSMAutoCompleteViewController(PS-还有其他方法,但是我更喜欢使用它,因为它易于实现。)
因此,您将需要一个textField Delegate方法,该方法将根据我的
strTextFieldType
变量区分两个textField并显示ViewController。//MARK:- TEXTFIELD DELEGATE
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == txtFromDestination
{
strTxtFieldType = "FromDestination"
}
else if textField == txtToDestination
{
strTxtFieldType = "ToDestination"
}
let acController = GMSAutocompleteViewController()
acController.delegate = self
self.present(acController, animated: true, completion: nil)
return false
}
我已将return设置为false,因为我不希望textFields是可编辑的。
以下是您需要为ViewController实现的扩展代码
extension YOUR_VIEWCONTROLLER_NAME: GMSAutocompleteViewControllerDelegate {
func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
print("Place name: \(place.name)")
print("Place address: \(place.formattedAddress ?? "null")")
if strTxtFieldType == "FromDestination"
{
self.txtFromDestination.text = place.formattedAddress
self.selectedFromDestination = place
}
else
{
self.txtToDestination.text = place.formattedAddress
self.selectedToDestination = place
}
print("Place attributions: \(String(describing: place.attributions))")
self.dismiss(animated: true, completion: nil)
}
func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
// TODO: handle the error.
// print("Error: \(error.description)")
self.dismiss(animated: true, completion: nil)
}
// User canceled the operation.
func wasCancelled(_ viewController: GMSAutocompleteViewController) {
print("Autocomplete was cancelled.")
self.dismiss(animated: true, completion: nil)
}
}
在那里,您现在完成。您可以在任何地方访问存储在selectedFromDestination和selectedToDestination中的值,就像currentLocation GMSPlace对象一样。
希望这会有所帮助; :-D! Lemme知道它是否对您有用。
关于swift - 如何创建GMSPlace,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35494076/