【问题标题】:Use textfield instead of searchbar in GMSAutocomplete in a same manner以相同的方式在 GMSAutocomplete 中使用文本字段而不是搜索栏
【发布时间】:2016-06-22 02:38:27
【问题描述】:

我正在使用 google Place Autocomplete API,我需要添加具有相同功能的 UITextField 而不是 UISearchBar。这是我从https://developers.google.com/places/ios-api/autocomplete 获得的 UISearchBar 的工作代码。如果有人帮助我从任何搜索关键字中获取地址数组,我将自己添加文本字段和表格视图。比如从字符串(关键字)到数组(预测位置)。

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

【问题讨论】:

    标签: ios swift google-maps autocomplete google-places-api


    【解决方案1】:

    集成您的 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)
        }
    }
    

    【讨论】:

    • 如何从预测对象中获取所选地点的坐标?
    • 我刚刚实现了这个并尝试在加拿大搜索特定地址,但它不起作用。它只显示地名,如机场名称或餐厅名称,但没有具体地址。如何在此处使用您的代码专门填充地址?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      //在你的View Controller里面有TextField和TableView的设置

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

      // 还设置 App 委托

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        相关资源
        最近更新 更多