Use textfield instead of searchbar in GMSAutocompl

2019-04-01 16:31发布

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
}
}

3条回答
我只想做你的唯一
2楼-- · 2019-04-01 17:09

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

查看更多
乱世女痞
3楼-- · 2019-04-01 17:15

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.

查看更多
贼婆χ
4楼-- · 2019-04-01 17:25

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)
    }
}
查看更多
登录 后发表回答