以相同的方式在GMSAutocomplete中使用textfield而不是searchbar

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以相同的方式在GMSAutocomplete中使用textfield而不是searchbar相关的知识,希望对你有一定的参考价值。

我正在使用谷歌广告自动完成API,我需要添加UITextField而不是UISearchBar具有相同的功能。这是我从https://developers.google.com/places/ios-api/autocomplete获得的UISearchBar的工作代码。我会自己添加textfield和tableview,如果有人帮我从任何搜索关键字获取地址数组。比如从字符串(关键字)到数组(预测的地方)。

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


答案

整合您的GPA(Google Places API)。 POD文件是:

pod 'GooglePlaces'
pod 'GooglePlacePicker'
pod 'GoogleMaps'

首先,将您的KEY提供给AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
        // Override point for customization after application launch.
        GMSPlacesClient.provideAPIKey("Your KEY")
        return true
    

首先,采用文本字段和表格视图。然后将这些行添加到ViewController.swift文件中并挂钩textField和tableView,最后运行它。

    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)
    

另一答案

如果您使用UITextField和您自己的UITableView代替UISearchController,那么直接使用GMSAutocompleteTableDataSource类会更容易。

GoogleMaps Cocoapod的代码示例之一显示了如何执行此操作。如果您已安装了pod,请在项目的SDKDemoAutocompleteWithTextFieldController目录中查找文件Pods/GoogleMaps/GoogleMapsSDKDemos/SDKDemos/PlacesSamples,或运行pod try GoogleMaps下载示例。

另一答案

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]) 

 

以上是关于以相同的方式在GMSAutocomplete中使用textfield而不是searchbar的主要内容,如果未能解决你的问题,请参考以下文章

在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?

你可以在控制器或路由中以相同的方式使用中间件吗?

使用 xstate,是不是可以配置一个适用于所有状态并在所有状态和子状态中以相同方式处理的事件?

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

如何在 C# 中以相同的方式随机化/洗牌两个数组

如何以与“TABLE name;”相同的方式格式化 postgres 结果做?