我想有一个自动完成文本字段,为我自动填充位置,如
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
希望这会有助于他人.