rani
rani

Reputation: 613

How to set the google places Autocomplete Requests to a UITextField in iOS

I am new to iOS programming. My requirement is to set the google places autocomplete request to a UITextField. I wrote the code as below

NSString *urlPath = [NSString stringWithFormat:@"/maps/api/place/autocomplete/json?input=%@&types=geocode&language=en-EN&sensor=false",string];
NSURL *url = [[NSURL alloc]initWithScheme:@"http" host:@"maps.googleapis.com" path:urlPath];
NSLog(@"url is:::%@",url);

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:url];
[request setHTTPMethod:@"POST"];

NSURLResponse *response ;
NSError *error;
NSData *data;
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"data is:::%@",data);

NSMutableDictionary *jsonDict= (NSMutableDictionary*)[NSJSONSerialization  JSONObjectWithData:data options:kNilOptions error:&error];
 NSLog(@"jsonDict is:%@",jsonDict);

But it gives empty. Can you tell me where I made wrong.

Upvotes: 1

Views: 4787

Answers (3)

Abhinav Jha
Abhinav Jha

Reputation: 345

Try the below Swift Code :-

import UIKit
import GooglePlaces

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {



@IBOutlet weak var txtField: UITextField!
@IBOutlet weak var tableView: UITableView!

var tableData = [GMSAutocompletePrediction]()

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)

    tableView.delegate = self
    tableView.dataSource = self

    self.tableView.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].attributedFullText.string
    return cell1
}

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    txtField.text = tableData[indexPath.row].attributedFullText.string
    getLatLongFromAutocompletePrediction(prediction:tableData[indexPath.row])
}

 func getLatLongFromAutocompletePrediction(prediction:GMSAutocompletePrediction){

    let placeClient = GMSPlacesClient()

    placeClient.lookUpPlaceID(prediction.placeID!) { (place, error) -> Void in
        if let error = error {
            //show error
            return
        }

        if let place = place {
            place.coordinate.longitude //longitude 
            place.coordinate.latitude //latitude
        } else {
        //show error
        }
    }
}
}

extension TableViewController: GMSAutocompleteFetcherDelegate {


func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {

    tableData.removeAll()

    for prediction in predictions{

        tableData.append(prediction)

    }
    tableView.reloadData()
}

func didFailAutocompleteWithError(_ error: Error) {
    print(error.localizedDescription)
   }
}

Upvotes: 2

Mrug
Mrug

Reputation: 5023

Hope MVAutocompletePlaceSearchTextField will be helpful

A very simple drop-in control to Achive Autocompletion place search in iOS

Upvotes: 1

Paresh Navadiya
Paresh Navadiya

Reputation: 38239

U will need key to request Google Places API. Refer SPGooglePlacesAutocomplete link which is according to your requirement.

EDIT : Refer Documentation.Also refer how to register for Google Places

Upvotes: 1

Related Questions