我正在尝试将搜索栏添加到我的一个应用程序中,该应用程序允许用户输入地址信息,并且会出现一个带有可能结果(和键盘)的表格视图。本质上与地图应用程序中提供的功能相同。是否有捷径可寻?
最好有一个当前位置默认和自动完成,但不是必需的。我可以从头开始构建 UI,但我不知道如何取回搜索结果。我可以使用地理编码器并将结果解析为表格视图吗?
有一个标准组件可以做到这一点,称为UISearchDisplayController。
它为您提供了 aUISearchBar
和 aUITableView
用于显示结果。然后可以根据需要自定义表格视图的内容和外观。
为了控制此类控制器执行的操作,您需要遵守UISearchDisplayDelegate协议。
我建议您仔细查看文档中可以找到的示例应用程序。
编辑
为了实现自动完成功能,您可以实现协议的searchDisplayController:shouldReloadTableForSearchString
方法UISearchDisplayDelegate
。它将在用户键入的每个字符处调用。
假设您有一个CLGeocoder
名为的属性geocoder
,并且您将地标保存在一个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;
}
每次搜索的输入字符串发生变化时,您都会使用该字符串执行前向地理编码。在completionHandler
块中,您将新找到的地标分配给您的placemarks
属性并重新加载表格。
请注意,由于搜索是异步的,您将负责在完成处理程序中重新加载表并在委托方法中返回 NO。返回 YES 将使表在搜索结束之前重新加载,这不是您想要的行为。
最后,请记住我提供的代码是最少的。在现实世界的应用程序中,您最好注意地理编码器可能遇到的错误,例如和kCLErrorGeocodeFoundNoResult
,记录在此。kCLErrorGeocodeFoundPartialResult
kCLErrorGeocodeCanceled