谷歌选择iOS的位置

时间:2017-12-30 19:53:17

标签: ios swift location google-developer-tools

我阅读this并尝试构建位置选择器应用,其中以下代码完美运行:

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 = ""
      }
    })
  }
}

显然{@ 1}}已被弃用,取而代之的是GMSPlacePicker,所以我尝试了here示例:

GMSPlacePickerViewController

但它运作不正常,我在这里遗漏了什么吗?弹出位置选择器,但取消按钮既不可点击,也不会在选择所需位置时关闭位置选择器,因此不会打印任何内容!

1 个答案:

答案 0 :(得分:0)

感谢@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"
    }
}