1

次のライブラリを使用して、swift 2.0 プロジェクトに Google プレイスのオートコンプリート 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

4

2 に答える 2

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 に答える
3

Google Places API for iOS を使用しないのはなぜですか? 上記のライブラリに見られるすべての機能を備えています。ここにリンクがあります https://developers.google.com/places/ios-api/autocomplete

fetcher オブジェクトを使用して予測を取得し、必要に応じて結果をカスタマイズできます。お役に立てれば

于 2016-02-15T10:26:00.173 に答える