谷歌为iOS选择位置



我读了这篇文章并尝试构建一个位置选择器应用程序,其中以下代码运行良好:

import UIKit
import GooglePlacePicker
class ViewController: UIViewController {
  // Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
  @IBOutlet var nameLabel: UILabel!
  @IBOutlet var addressLabel: UILabel!
  // Add a UIButton in Interface Builder, and connect the action to this function.
  @IBAction func pickPlace(_ sender: UIButton) {
    let center = CLLocationCoordinate2D(latitude: 37.788204, longitude: -122.411937)
    let northEast = CLLocationCoordinate2D(latitude: center.latitude + 0.001, longitude: center.longitude + 0.001)
    let southWest = CLLocationCoordinate2D(latitude: center.latitude - 0.001, longitude: center.longitude - 0.001)
    let viewport = GMSCoordinateBounds(coordinate: northEast, coordinate: southWest)
    let config = GMSPlacePickerConfig(viewport: viewport)
    let placePicker = GMSPlacePicker(config: config)
    placePicker.pickPlace(callback: {(place, error) -> Void in
      if let error = error {
        print("Pick Place error: (error.localizedDescription)")
        return
      }
      if let place = place {
        self.nameLabel.text = place.name
        self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
          .joined(separator: "n")
      } else {
        self.nameLabel.text = "No place selected"
        self.addressLabel.text = ""
      }
    })
  }
}

显然GMSPlacePicker已被弃用,取而代之的是 GMSPlacePickerViewController ,所以我在这里尝试了这个例子:

import UIKit
import GooglePlacePicker
class ViewController: UIViewController {
  // Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
  @IBOutlet var nameLabel: UILabel!
  @IBOutlet var addressLabel: UILabel!
// The code snippet below shows how to create and display a GMSPlacePickerViewController.
@IBAction func pickPlace(_ sender: UIButton) {
  let config = GMSPlacePickerConfig(viewport: nil)
  let placePicker = GMSPlacePickerViewController(config: config)
  present(placePicker, animated: true, completion: nil)
}
// To receive the results from the place picker 'self' will need to conform to
// GMSPlacePickerViewControllerDelegate and implement this code.
func placePicker(_ viewController: GMSPlacePickerViewController, didPick place: GMSPlace) {
  // Dismiss the place picker, as it cannot dismiss itself.
  viewController.dismiss(animated: true, completion: nil)
  print("Place name (place.name)")
  print("Place address (place.formattedAddress)")
  print("Place attributions (place.attributions)")
}
func placePickerDidCancel(_ viewController: GMSPlacePickerViewController) {
  // Dismiss the place picker, as it cannot dismiss itself.
  viewController.dismiss(animated: true, completion: nil)
  print("No place selected")
}
}

但是它无法正常运行,我在这里错过了什么吗?位置选取器正在弹出,但取消按钮都不可单击,位置选取器在选取所需位置时也不会关闭,因此不会打印任何内容!

感谢完整工作代码下方@tassinai的评论:

import UIKit
import GooglePlacePicker
class ViewController: UIViewController, GMSPlacePickerViewControllerDelegate  {
    @IBOutlet weak var placeNameLabel: UILabel!
    @IBAction func placePicker(_ sender: Any) {
        let config = GMSPlacePickerConfig(viewport: nil)
        let placePicker = GMSPlacePickerViewController(config: config)
        placePicker.delegate = self
        present(placePicker, animated: true, completion: nil)
    }
    func placePicker(_ viewController: GMSPlacePickerViewController, didPick place: GMSPlace) {
        viewController.dismiss(animated: true, completion: nil)
        print("Place name (place.name)")
        placeNameLabel.text = place.name
    }
    func placePicker(_ viewController: GMSPlacePickerViewController, didFailWithError error: Error) {
    // In your own app you should handle this better, but for the demo we are just going to log
    // a message.
         NSLog("An error occurred while picking a place: (error)")
    }
    func placePickerDidCancel(_ viewController: GMSPlacePickerViewController) {
        // Dismiss the place picker, as it cannot dismiss itself.
        viewController.dismiss(animated: true, completion: nil)
        print("No place selected")
        placeNameLabel.text = "No place selected"
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
  }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

下面是编写上述代码的另一种方式:

import UIKit
import GooglePlacePicker
class ViewController: UIViewController {
    @IBOutlet weak var placeNameLabel: UILabel!
    @IBAction func placePicker(_ sender: Any) {
        let config = GMSPlacePickerConfig(viewport: nil)
        let placePicker = GMSPlacePickerViewController(config: config)
        placePicker.delegate = self
        present(placePicker, animated: true, completion: nil)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
  }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
extension ViewController : GMSPlacePickerViewControllerDelegate {
    func placePicker(_ viewController: GMSPlacePickerViewController, didPick place: GMSPlace) {
        viewController.dismiss(animated: true, completion: nil)
        print("Place name (place.name)")
        placeNameLabel.text = place.name
    }
    func placePicker(_ viewController: GMSPlacePickerViewController, didFailWithError error: Error) {
        // In your own app you should handle this better, but for the demo we are just going to log
        // a message.
        NSLog("An error occurred while picking a place: (error)")
    }
    func placePickerDidCancel(_ viewController: GMSPlacePickerViewController) {
        // Dismiss the place picker, as it cannot dismiss itself.
        viewController.dismiss(animated: true, completion: nil)
        print("No place selected")
        placeNameLabel.text = "No place selected"
    }
}

最新更新