I am using google Place Autocomplete API, i need to add UITextField instead of UISearchBar with the same functionality. here is the working code with UISearchBar which i get from https://developers.google.com/places/ios-api/autocomplete. I will add textfield and tableview myself, if someone just help me to get array of addresses from any keyword of searching. like from string (of keyword) to array(predicted places).
import UIKit
import GoogleMaps
class ViewController: UIViewController {
var resultsViewController: GMSAutocompleteResultsViewController?
var searchController: UISearchController?
var resultView: UITextView?
override func viewDidLoad() {
super.viewDidLoad()
resultsViewController = GMSAutocompleteResultsViewController()
resultsViewController?.delegate = self
searchController = UISearchController(searchResultsController: resultsViewController)
searchController?.searchResultsUpdater = resultsViewController
let subView = UIView(frame: CGRectMake(0, 65.0, 350.0, 45.0))
subView.addSubview((searchController?.searchBar)!)
self.view.addSubview(subView)
searchController?.searchBar.sizeToFit()
searchController?.hidesNavigationBarDuringPresentation = false
self.definesPresentationContext = true
}
}
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
func resultsController(resultsController: GMSAutocompleteResultsViewController,
didAutocompleteWithPlace place: GMSPlace) {
searchController?.active = false
print("Place name: ", place.name)
print("Place address: ", place.formattedAddress!)
}
func resultsController(resultsController: GMSAutocompleteResultsViewController,
didFailAutocompleteWithError error: NSError){
print("Error: ", error.description)
}
func didRequestAutocompletePredictionsForResultsController(resultsController: GMSAutocompleteResultsViewController) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
}
func didUpdateAutocompletePredictionsForResultsController(resultsController: GMSAutocompleteResultsViewController) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
}
Integrate your GPA(Google Places API). POD files are :
pod 'GooglePlaces'
pod 'GooglePlacePicker'
pod 'GoogleMaps'
At first, provide your KEY to AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GMSPlacesClient.provideAPIKey("Your KEY")
return true
}
At first, take a text field and a table view. Then add these line to your ViewController.swift file and hook the textField and tableView and finally run it.
import UIKit
import GooglePlaces
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{
@IBOutlet weak var PlaceTextField: UITextField!
@IBOutlet weak var tableView: UITableView!
var tableData=[String]()
var fetcher: GMSAutocompleteFetcher?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.lightGray
self.edgesForExtendedLayout = []
// Set bounds to inner-west Sydney Australia.
let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366,
longitude: 151.134002)
let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725,
longitude: 151.200349)
let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
coordinate: swBoundsCorner)
// Set up the autocomplete filter.
let filter = GMSAutocompleteFilter()
filter.type = .establishment
// Create the fetcher.
fetcher = GMSAutocompleteFetcher(bounds: bounds, filter: filter)
fetcher?.delegate = self as! GMSAutocompleteFetcherDelegate
PlaceTextField.addTarget(self, action: #selector(ViewController.textFieldDidChanged(_:)), for: UIControlEvents.editingChanged)
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
}
// MARK: -UITextField Action
@objc func textFieldDidChanged(_ textField:UITextField ){
print(PlaceTextField.text!)
fetcher?.sourceTextHasChanged(PlaceTextField.text!)
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var section = indexPath.section
var row = indexPath.row
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier:"addCategoryCell")
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.backgroundColor = UIColor.clear
cell.contentView.backgroundColor = UIColor.clear
cell.textLabel?.textAlignment = NSTextAlignment.left
cell.textLabel?.textColor = UIColor.black
cell.textLabel?.font = UIFont.systemFont(ofSize: 14.0)
cell.textLabel?.text = tableData[indexPath.row]
return cell
}
}
extension ViewController: GMSAutocompleteFetcherDelegate {
func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
tableData.removeAll()
for prediction in predictions {
tableData.append(prediction.attributedPrimaryText.string)
//print("\n",prediction.attributedFullText.string)
//print("\n",prediction.attributedPrimaryText.string)
//print("\n********")
}
tableView.reloadData()
}
func didFailAutocompleteWithError(_ error: Error) {
print(error.localizedDescription)
}
}
If you're using a UITextField and your own UITableView in place of a UISearchController, then it's easier to use the GMSAutocompleteTableDataSource class directly.
One of the code samples for the GoogleMaps Cocoapod shows how to do this. Look for the file SDKDemoAutocompleteWithTextFieldController
in the Pods/GoogleMaps/GoogleMapsSDKDemos/SDKDemos/PlacesSamples
directory of your project if you've installed the pod, or run pod try GoogleMaps
to download the samples.
For India Latitude and Longitude and this is a Right Answer A Jellies girl make this Downvote please check the code this is absolutely right answer
//In your View Controller there TextField and TableView Setup
import UIKit
import GooglePlaces
class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var txtField: UITextField!
@IBOutlet weak var table1: UITableView!
var tableData = [String]()
var fetcher: GMSAutocompleteFetcher?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
self.edgesForExtendedLayout = []
let nsBoundsCorner = CLLocationCoordinate2D(latitude: 20.5937, longitude: 78.9629)
let bounds = GMSCoordinateBounds(coordinate: nsBoundsCorner, coordinate: nsBoundsCorner)
let filter = GMSAutocompleteFilter()
filter.type = .establishment
fetcher = GMSAutocompleteFetcher(bounds: bounds, filter: filter)
fetcher?.delegate = self
txtField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),for: .editingChanged)
table1.delegate = self
table1.dataSource = self
self.table1.reloadData()
// Do any additional setup after loading the view.
}
@objc func textFieldDidChange(textField: UITextField) {
fetcher?.sourceTextHasChanged(txtField.text!)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableData.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var section = indexPath.section
var row = indexPath.row
let cell1 : UITableViewCell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell1")
cell1.selectionStyle = UITableViewCellSelectionStyle.none
cell1.backgroundColor = UIColor.clear
cell1.contentView.backgroundColor = UIColor.clear
cell1.textLabel?.textAlignment = NSTextAlignment.left
cell1.textLabel?.textColor = UIColor.black
cell1.textLabel?.font = UIFont.systemFont(ofSize: 14.0)
cell1.textLabel?.text = tableData[indexPath.row]
return cell1
}
// extension TableViewController: GMSAutocompleteFetcherDelegate {
//
// func didAutocompleteWithPredictions(predictions: [GMSAutocompletePrediction]) {
//
// tableData.removeAll()
//
// for prediction in predictions {
//
// tableData.append(prediction.attributedPrimaryText.string)
//
// }
//
// table1.reloadData()
// }
//
// }
@IBAction func textField1(_ sender: Any) {
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
extension TableViewController: GMSAutocompleteFetcherDelegate {
func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
tableData.removeAll()
for prediction in predictions{
tableData.append(prediction.attributedFullText.string)
}
table1.reloadData()
}
func didFailAutocompleteWithError(_ error: Error) {
print(error.localizedDescription)
}
}
// Also Setup App delegate
import UIKit
import GooglePlaces
import GoogleMaps
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//// [GMSPlacesClient provideAPIKey:...]
// [GMSPlacesClient .provideAPIKey("xxxxxxxxxxxxxxxxxxxxxx")]
GMSPlacesClient.provideAPIKey("xxxxxxx")
GMSServices.provideAPIKey("xxxxxxxxxx")
return true
}
}
See The Output Image its work like this
By Govind Kumar 12-12-2017