我想有一个自动完成文本字段,为我自动填充位置,如
android的那个:
https://developers.google.com/places/training/autocomplete-android
有谁知道我在哪里可以找到这个或一个例子的教程?
谢谢!
解决方法
脚步 :
>在swift项目中添加Alamofire CocoaPods.
>在Google API控制台上查找您的Google地方API密钥.
>添加以下代码
ViewController.swift
- import UIKit
- class ViewController: UIViewController {
- override func viewDidAppear(animated: Bool) {
- super.viewDidAppear(animated)
- let gpaViewController = GooglePlacesAutocomplete(
- apiKey: "YOUR GOOGLE PLACE API KEY",placeType: .Address
- )
- gpaViewController.placeDelegate = self
- presentViewController(gpaViewController,animated: true,completion: nil)
- }
- }
- extension ViewController: GooglePlacesAutocompleteDelegate {
- func placeSelected(place: Place) {
- println(place.description)
- }
- func placeViewClosed() {
- dismissViewControllerAnimated(true,completion: nil)
- }
- }
GooglePlacesAutocomplete.swift
- import UIKit
- import Alamofire
- enum PlaceType: Printable {
- case All
- case Geocode
- case Address
- case Establishment
- case Regions
- case Cities
- var description : String {
- switch self {
- case .All: return ""
- case .Geocode: return "geocode"
- case .Address: return "address"
- case .Establishment: return "establishment"
- case .Regions: return "regions"
- case .Cities: return "cities"
- }
- }
- }
- struct Place {
- let id: String
- let description: String
- }
- protocol GooglePlacesAutocompleteDelegate {
- func placeSelected(place: Place)
- func placeViewClosed()
- }
- // MARK: - GooglePlacesAutocomplete
- class GooglePlacesAutocomplete: UINavigationController {
- var gpaViewController: GooglePlacesAutocompleteContainer?
- var placeDelegate: GooglePlacesAutocompleteDelegate? {
- get { return gpaViewController?.delegate }
- set { gpaViewController?.delegate = newValue }
- }
- convenience init(apiKey: String,placeType: PlaceType = .All) {
- let gpaViewController = GooglePlacesAutocompleteContainer(
- apiKey: apiKey,placeType: placeType
- )
- self.init(rootViewController: gpaViewController)
- self.gpaViewController = gpaViewController
- let closeButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop,target: self,action: "close")
- gpaViewController.navigationItem.leftBarButtonItem = closeButton
- gpaViewController.navigationItem.title = "Enter Address"
- }
- func close() {
- placeDelegate?.placeViewClosed()
- }
- }
- // MARK: - GooglePlaceSearchDisplayController
- class GooglePlaceSearchDisplayController: UISearchDisplayController {
- override func setActive(visible: Bool,animated: Bool) {
- if active == visible { return }
- searchContentsController.navigationController?.navigationBarHidden = true
- super.setActive(visible,animated: animated)
- searchContentsController.navigationController?.navigationBarHidden = false
- if visible {
- searchBar.becomeFirstResponder()
- } else {
- searchBar.resignFirstResponder()
- }
- }
- }
- // MARK: - GooglePlacesAutocompleteContainer
- class GooglePlacesAutocompleteContainer: UIViewController {
- var delegate: GooglePlacesAutocompleteDelegate?
- var apiKey: String?
- var places = [Place]()
- var placeType: PlaceType = .All
- convenience init(apiKey: String,placeType: PlaceType = .All) {
- self.init(nibName: "GooglePlacesAutocomplete",bundle: nil)
- self.apiKey = apiKey
- self.placeType = placeType
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- let tv: UITableView? = searchDisplayController?.searchResultsTableView
- tv?.registerClass(UITableViewCell.self,forCellReuseIdentifier: "Cell")
- }
- }
- // MARK: - GooglePlacesAutocompleteContainer (UITableViewDataSource / UITableViewDelegate)
- extension GooglePlacesAutocompleteContainer: UITableViewDataSource,UITableViewDelegate {
- func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
- return places.count
- }
- func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
- let cell = self.searchDisplayController?.searchResultsTableView?.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as UITableViewCell
- // Get the corresponding candy from our candies array
- let place = self.places[indexPath.row]
- // Configure the cell
- cell.textLabel.text = place.description
- cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
- return cell
- }
- func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
- delegate?.placeSelected(self.places[indexPath.row])
- }
- }
- // MARK: - GooglePlacesAutocompleteContainer (UISearchDisplayDelegate)
- extension GooglePlacesAutocompleteContainer: UISearchDisplayDelegate {
- func searchDisplayController(controller: UISearchDisplayController,shouldReloadTableForSearchString searchString: String!) -> Bool {
- getPlaces(searchString)
- return false
- }
- private func getPlaces(searchString: String) {
- Alamofire.request(.GET,"https://maps.googleapis.com/maps/api/place/autocomplete/json",parameters: [
- "input": searchString,"type": "(\(placeType.description))","key": apiKey ?? ""
- ]).responseJSON { request,response,json,error in
- if let response = json as? NSDictionary {
- if let predictions = response["predictions"] as? Array<AnyObject> {
- self.places = predictions.map { (prediction: AnyObject) -> Place in
- return Place(
- id: prediction["id"] as String,description: prediction["description"] as String
- )
- }
- }
- }
- self.searchDisplayController?.searchResultsTableView?.reloadData()
- }
- }
- }
GooglePlacesAutocomplete.xib
希望这会有助于他人.