Reputation: 73
I am currently trying to make a searchbar that autopopulates with locations as the user types. I am using a MKLocalSearch to get a MKLocalSearchResponse and it appears to return values I can use. However to get the name, address or coordinates out of the search needs access to the MKPlacemark property in the search response. When I access the placemark I get the error:
'placemark' is unavailable: APIs deprecated as of iOS7 and earlier are unavailable in Swift
var request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchText
//PUT HERE: check if network is on?
let localSearch: MKLocalSearch = MKLocalSearch(request: request)
localSearch.startWithCompletionHandler { (response: MKLocalSearchResponse!, error: NSError!) -> Void in
if (error == nil) {
println("searched")
for res in response.mapItems {
self.userSearch.append(res.placemark)
}
self.userSearch = response.mapItems.placemark
self.tableView?.reloadData()
} else {
println(error)
}
}
}
Does anyone know a workaround to accessing the placemark?
Thanks!
Upvotes: 4
Views: 1051
Reputation:
The response.mapItems
array is declared in the API as of type [AnyObject]!
.
The for
loop isn't explicitly saying that res
is of type MKMapItem
(or that response.mapItems
is actually [MKMapItem]
).
So res
is treated like an instance of AnyObject
which isn't defined as having a placemark
property.
This is why you get the compiler error 'placemark' is unavailable...
.
To fix this, cast res
as an MKMapItem
and then the placemark
property will become visible.
Example:
for res in response.mapItems {
if let mi = res as? MKMapItem {
self.userSearch.append(mi.placemark)
}
}
for
loop:
self.userSearch = response.mapItems.placemark
doesn't make sense if userSearch
is supposed to be an array of placemarks.
The for
loop is appending placemarks to that array and then this line is setting the array to a single placemark object (in addition, the mapItems
object doesn't even have a placemark
property).
This line should most likely be removed.
Upvotes: 4