我正在尝试将一个搜索栏添加到我的某个应用程序中,该应用程序允许用户输入地址信息,并显示带有可能结果的桌面视图(和键盘)。基本上与地图应用中提供的功能相同。有一个简单的方法吗?
有一个当前位置默认&自动完成,但不是必需的。我可以从头开始构建UI,但我不知道如何取回搜索结果。我可以使用地理编码器并将结果解析为tableview吗?
答案 0 :(得分:10)
有一个标准组件,称为UISearchDisplayController。
它会为您显示结果UISearchBar
和UITableView
。
然后,您可以根据需要自定义表格视图的内容和外观。
为了控制此类控制器执行的操作,您需要符合UISearchDisplayDelegate协议。
我建议您仔细查看文档中的example app。
修改强>
为了实现自动完成功能,您可以实现searchDisplayController:shouldReloadTableForSearchString
协议的UISearchDisplayDelegate
方法。它将在用户键入的每个字符处调用。
假设您有一个名为CLGeocoder
的{{1}}属性,并且您将地标放在名为geocoder
的{{1}}属性中,以下是您可以实现的示例实时自动完成:
NSArray
每次搜索的输入字符串发生更改时,都会使用此类字符串执行正向地理编码。在placemarks
块中,将新找到的地标分配给-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self.geocoder geocodeAddressString:searchString completionHandler:^(NSArray *placemarks, NSError *error) {
self.placemarks = placemarks;
[self.searchDisplayController.searchResultsTableView reloadData];
}];
return NO;
}
属性并重新加载表格。
请注意,由于搜索是异步的,您将负责在完成处理程序中重新加载表,并在委托方法中返回NO。返回YES将使表在搜索结束之前重新加载,这不是您想要的行为。
作为最后的评论,请记住我提供的代码很少。在真实应用中,您最好处理地理编码器可能遇到的错误,例如completionHandler
,placemarks
和kCLErrorGeocodeFoundNoResult
,记录here。