Не понимаю как использовать поиск
я новичок в swift Использую YandexMapKit Задача: Нужно забить в форме такие поля как
- страна
- город
- улица
- регион
- индекс
могу ли я вообще их получить? Да худо бедно я понял как мне использовать suggest для поиска вариантов. Но вот понять не могу как потом получить ответ в формате чтобы нужные мне поля были хотя бы подписаны!
максимум я получаю строку адреса когда ищу suggest(варианты) просмотрел демо и доку не разобрался! помогите xD
Ответы (1 шт):
Автор решения: schmidt9
→ Ссылка
Компоненты можно получить, используя следующий код (на основе класса SuggestViewController из демо)
let searchManager = YMKSearch.sharedInstance().createSearchManager(with: .combined)
var searchSession: YMKSearchSession?
let BOUNDING_BOX = YMKBoundingBox( // Москва
southWest: YMKPoint(latitude: 55.55, longitude: 37.42),
northEast: YMKPoint(latitude: 55.95, longitude: 37.82))
let SEARCH_OPTIONS = YMKSearchOptions()
lazy var geometry = YMKGeometry(boundingBox: BOUNDING_BOX)
// ...
func onSearchResponse(_ response: YMKSearchResponse) {
for searchResult in response.collection.children {
guard let obj = searchResult.obj else {
continue
}
guard let objMetadata = obj.metadataContainer.getItemOf(YMKSearchToponymObjectMetadata.self) as? YMKSearchToponymObjectMetadata else {
continue
}
let address = objMetadata.address
let formattedAddress = address.formattedAddress
let postalCode = address.postalCode ?? "none"
let additionalInfo = address.additionalInfo ?? "none"
print("formattedAddress", formattedAddress)
print("postalCode", postalCode)
print("additionalInfo", additionalInfo)
print("components:")
address.components.forEach {
let value = $0.name
$0.kinds.forEach {
let kind = YMKSearchComponentKind(rawValue: UInt(truncating: $0))
switch kind {
case .country:
print("country: \(value)")
case .region:
print("region: \(value)")
case .locality:
print("locality: \(value)")
case .street:
print("street: \(value)")
case .house:
print("house number: \(value)")
default:
break
}
}
}
print("==========")
}
}
func onSearchError(_ error: Error) {
let searchError = (error as NSError).userInfo[YRTUnderlyingErrorKey] as! YRTError
var errorMessage = "Unknown error"
if searchError.isKind(of: YRTNetworkError.self) {
errorMessage = "Network error"
} else if searchError.isKind(of: YRTRemoteError.self) {
errorMessage = "Remote server error"
}
let alert = UIAlertController(title: "Error", message: errorMessage, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
@IBAction func queryChanged(_ sender: UITextField) {
let responseHandler = {(searchResponse: YMKSearchResponse?, error: Error?) -> Void in
if let response = searchResponse {
self.onSearchResponse(response)
} else {
self.onSearchError(error!)
}
}
searchSession = searchManager.submit(
withText: sender.text!,
geometry: geometry,
searchOptions: SEARCH_OPTIONS,
responseHandler: responseHandler)
}