1

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

https://github.com/watsonbox/ios_google_places_autocomplete

我唯一无法弄清楚的是,我想将它与uitextfield我的应用程序表单中的存在整合在一起,该表单具有国家和城市字段。

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

请通过指导我将此库与uitextfieldso 集成来帮助我,仅当用户键入uitextfield结果如下所示时uitextfield

通过在演示应用程序中实现代码,我知道搜索框打开了以下代码:

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

我无法弄清楚如何让这个viewcontroller功能在我身上工作,uitextfield所以它可以完全按照它的工作原理工作uitextfield

4

2 回答 2

3

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

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

于 2016-02-15T10:26:00.173 回答
3

使用搜索栏的 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 委托而不是搜索栏来调用函数

于 2016-12-01T11:47:33.500 回答