Cri*_*tiC 8 xcode objective-c cllocation mklocalsearch
我想允许用户搜索街道名称并将结果显示在UITableView中.目前该地区并不重要,它可以来自任何地区.
我在搜索中找不到任何相关示例,我不知道是否应该使用CLLocation或MKLocalSearch.
根据文档,我应该使用MKLocalSearch:
虽然本地搜索和地理编码类似,但它们支持不同的用例.如果要在地图坐标和结构化地址(例如地址簿地址)之间进行转换,请使用地理编码.如果要查找与用户输入匹配的一组位置,请使用本地搜索.
但我尝试了两种方法,它只给了我一个结果(即使 - 虽然有一个NSArray返回.
这是CLGeocoder方法:
CLGeocoder *geocoding = [[CLGeocoder alloc] init];
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"%i", [placemarks count]);
for(CLPlacemark *myStr in placemarks) {
NSLog(@"%@", myStr);
}
}
}];
Run Code Online (Sandbox Code Playgroud)
这是我的MKLocalSearch尝试:
MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = theTextField.text;
request.region = self.region;
localSearch = [[MKLocalSearch alloc] initWithRequest:request];
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){
if (error != nil) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil)
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
if ([response.mapItems count] == 0) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil)
message:nil
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
self.streets = response;
[self.streetsTableView reloadData];
}];
Run Code Online (Sandbox Code Playgroud)
在某些情况下,MKLocalSearch似乎返回超过1个响应,但这些与非街道名称搜索的地方有关.
提前致谢.
这是我能得到的最接近的。这涉及到使用google place API Web Service。
注意:您可能可以使用他们的 Google Maps API 等。我确信还有其他方法可以从各种 Google API 获取此信息。
NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&location=%f,%f&sensor=true&key=API_KEY", formattedSearchText, location.coordinate.latitude,
location.coordinate.longitude]];
Run Code Online (Sandbox Code Playgroud)
响应是一个 JSON 对象。将其转换为字典。
NSDictionary *response = [NSJSONSerialization JSONObjectWithData:_googlePlacesResponse
options:NSJSONReadingMutableContainers error:&error];
if([[response objectForKey:@"status"] isEqualToString:@"OK"])
{
NSArray *predictions = [response objectForKey:@"predictions"];
for(NSDictionary *prediction in predictions)
{
NSArray *addressTypes = [prediction objectForKey:@"types"];
if([addressTypes containsObject:@"route"])
{
//This search result contains a street name.
//Now get the street name.
NSArray *terms = [prediction objectForKey:@"terms"];
NSDictionary *streetNameKeyValuePair = [terms objectAtIndex:0];
NSLog(@"%@",[streetNameKeyValuePair objectForKey@"value"]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
可能的情况types似乎是
您可以使用仅predictions包含地址类型的内容来填充表视图。这可行。route
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |