Google размещает автозаполнение iOS Swift, интегрируется с uitextfield

Я пытаюсь реализовать автозаполнение API Google Places в проекте Swift 2.0, используя следующую библиотеку:

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.


person Niranjan Balkrishna Prajapati    schedule 23.01.2016    source источник
comment
Вы сделали это с текстовым полем в Swift? если да, я тоже ищу такой же, если возможно, вы можете предоставить образец, спасибо!   -  person Anilkumar iOS - ReactNative    schedule 15.09.2017


Ответы (2)


Почему бы не использовать API Google Places для iOS? Он имеет все возможности, указанные в упомянутой библиотеке. Вот ссылка https://developers.google.com/places/ios-api/autocomplete

и вы можете использовать объект fetcher для получения прогнозов и в соответствии с любыми требованиями вы можете настроить результат. Надеюсь это поможет

person Ankahathara    schedule 15.02.2016

API автозаполнения Google с помощью панели поиска

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 вместо панели поиска

person Hardik Thakkar    schedule 01.12.2016
comment
Где методы делегирования табличного представления, бро? - person B.Saravana Kumar; 15.06.2017
comment
Когда я выбираю одно место, это означает, что произошло дальше. Можете ли вы предоставить делегата табличного представления для выбора строки, братан? - person B.Saravana Kumar; 15.06.2017
comment
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print(arrPlaces.objectAtIndex(indexPath.row) as! String)} вам нужно использовать массив arrPlaces для отображения данных в табличном представлении - person Hardik Thakkar; 15.06.2017
comment
Как я могу получить лат для каждого результата? - person Krunal Nagvadia; 13.09.2019
comment
Вам необходимо реализовать приведенный выше код с некоторыми исправлениями, связанными с ключом API и другими параметрами, и распечатать вывод googlePlacesResult. Вы получите lat long в этом. - person Hardik Thakkar; 13.09.2019