7

我正在尝试将搜索栏添加到我的一个应用程序中,该应用程序允许用户输入地址信息,并且会出现一个带有可能结果(和键盘)的表格视图。本质上与地图应用程序中提供的功能相同。是否有捷径可寻?

在此处输入图像描述

最好有一个当前位置默认和自动完成,但不是必需的。我可以从头开始构建 UI,但我不知道如何取回搜索结果。我可以使用地理编码器并将结果解析为表格视图吗?

4

1 回答 1

10

有一个标准组件可以做到这一点,称为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,记录在此kCLErrorGeocodeFoundPartialResultkCLErrorGeocodeCanceled

于 2012-12-28T06:00:42.120 回答