【问题标题】:google places autocomplete ios swift integrate with uitextfieldgoogle 地方自动完成 ios swift 与 uitextfield 集成
【发布时间】:2016-04-30 02:53:01
【问题描述】:

我正在尝试使用以下库在 swift 2.0 项目中实现 google places 自动完成 api:

https://github.com/watsonbox/ios_google_places_autocomplete

我唯一想不通的是,我想将此与 uitextfield 集成在我的应用程序表单中,该表单具有国家和城市字段。

我在一个演示项目中实现了这个应用程序,发现它还为我提供了经纬度的位置。

请通过指导我将此库与uitextfield 集成来帮助我,因此当用户输入uitextfield 时,结果仅显示在uitextfield 下方。

通过在演示应用中实现代码,我了解到搜索框打开时会显示以下代码:

let gpaViewController = GooglePlacesAutocomplete(
        apiKey: "API KEY FROM GOOGLE PLACES API",
        placeType: .Address
    )

我不知道如何让这个viewcontroller 功能在我的uitextfield 上工作,所以它可以完全像在uitextfield 上工作一样工作

【问题讨论】:

  • 你是在 swift 中使用文本字段完成的吗?如果是这样,我也在寻找相同的,如果可能的话,你能提供样品吗,谢谢!

标签: ios swift2 google-places-api xcode7.1


【解决方案1】:

为什么不使用适用于 iOS 的 Google Places API?它具有上述库中所见的所有功能。这是链接https://developers.google.com/places/ios-api/autocomplete

您可以使用 fetcher 对象来获取预测,并根据任何要求自定义结果。希望这会有所帮助

【讨论】:

    【解决方案2】:

    使用搜索栏的 Google 自动完成 API

    1)

    let googleAutoCompeteApi = "https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&types=establishment|geocode&location=%@,%@&radius=500&language=en&key=%@"
    var arrPlaces = NSMutableArray(capacity: 100)
    let operationQueue = NSOperationQueue()
    let googleServerkey = "Your API KEY"
    

    2)

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        self.beginSearching(searchText: searchText)
    }
    
    func beginSearching(searchText:String) {
        if searchText.count == 0 {
            self.arrPlaces.removeAllObjects()
            // self.tblOfflineCity.reloadData()
            return
        }
    
        operationQueue.addOperation { () -> Void in
            self.forwardGeoCoding(searchTexts:searchText)
        }
    }
    
    //MARK: - Search place from Google -
    
    
    func forwardGeoCoding(searchTexts:String) {
        googlePlacesResult(input: searchTexts) { (result) -> Void in
            let searchResult:NSDictionary = ["keyword":searchTexts,"results":result]
            if result.count > 0
            {
                let features = searchResult.value(forKey: "results") as! [AnyObject]
                self.arrPlaces = NSMutableArray(capacity: 100)
    
                for dictAddress in features   {
                    if let content = dictAddress.value(forKey:"description") as? String {
                        self.arrPlaces.addObjects(from: [content])
                    }
                }
                DispatchQueue.main.async {
                    //self.tblOfflineCity.reloadData()
                }
            }
        }
    }
    
    func googlePlacesResult(input: String, completion: @escaping (_ result: NSArray) -> Void) {
        let searchWordProtection = input.replacingOccurrences(of: " ", with: "")
        if searchWordProtection.count != 0 {
            let urlString = NSString(format: googleAutoCompeteApi as NSString,input,currentLat,currentLong,googleServerkey)
            let url = NSURL(string: urlString.addingPercentEscapes(using: String.Encoding.utf8.rawValue)!)
            let defaultConfigObject = URLSessionConfiguration.default
            let delegateFreeSession = URLSession(configuration: defaultConfigObject, delegate: nil, delegateQueue: OperationQueue.main)
            let request = NSURLRequest(url: url! as URL)
            let task =  delegateFreeSession.dataTask(with: request as URLRequest,completionHandler: {
                (data, response, error) -> Void in
                if let data = data {
                    do {
                        let jSONresult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:AnyObject]
                        let results:NSArray = jSONresult["predictions"] as! NSArray
                        let status = jSONresult["status"] as! String
    
                        if status == "NOT_FOUND" || status == "REQUEST_DENIED" {
                            let userInfo:NSDictionary = ["error": jSONresult["status"]!]
    
                            let newError = NSError(domain: "API Error", code: 666, userInfo: userInfo as [NSObject : AnyObject] as [NSObject : AnyObject] as? [String : Any])
                            let arr:NSArray = [newError]
                            completion(arr)
                            return
                        } else {
                            completion(results)
                        }
                    }
                    catch {
                        print("json error: \(error)")
                    }
                } else if error != nil {
                    // print(error.description)
                }
            })
            task.resume()
        }
    }
    

    你会在 self.arrPlaces 中得到结果。要在 uitextField 中使用,您只需要使用 uitextField 委托而不是搜索栏来调用函数

    【讨论】:

    • 表视图委托方法在哪里,兄弟?
    • 当我选择一个地方意味着接下来发生了什么,你能给我选择行的表格视图委托吗?
    • func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print(arrPlaces.objectAtIndex(indexPath.row) as!String) } 你需要使用 arrPlaces 数组来在 tableview 中显示数据
    • 我怎样才能得到每个结果的经纬度?
    • 你需要执行上面的代码,修正API key和其他参数,并打印googlePlacesResult的输出。你会得到很长的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多