位置搜索结果叠加

Jam*_*eir 7 search location ios

我正在尝试将一个搜索栏添加到我的某个应用程序中,该应用程序允许用户输入地址信息,并显示带有可能结果的桌面视图(和键盘).基本上与地图应用中提供的功能相同.是否有捷径可寻?

在此输入图像描述

拥有当前位置默认和自动完成功能会很不错,但不是必需的.我可以从头开始构建UI,但我不知道如何取回搜索结果.我可以使用地理编码器并将结果解析为tableview吗?

Gab*_*lla 10

有一个标准组件,称为UISearchDisplayController.

它为您提供a UISearchBar和a UITableView显示结果.然后,您可以根据需要自定义表视图的内容和外观.

为了控制此类控制器执行的操作,您需要符合UISearchDisplayDelegate协议.

我建议您仔细查看可以在doc上找到的示例应用程序.

编辑

为了实现自动完成功能,您可以实现协议的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;
}
Run Code Online (Sandbox Code Playgroud)

每次搜索的输入字符串发生更改时,都会使用此类字符串执行正向地理编码.在completionHandler块中,您将新找到的地标分配给您的placemarks属性并重新加载表.

请注意,由于搜索是异步的,因此您将负责在完成处理程序中重新加载表,并在委托方法中返回NO.返回YES将使表在搜索结束之前重新加载,这不是您想要的行为.

最后一点,请记住我提供的代码很少.在现实世界的应用程序,你最好小心地理编码器可能会碰到的错误,如kCLErrorGeocodeFoundNoResult,kCLErrorGeocodeFoundPartialResultkCLErrorGeocodeCanceled,记录在这里.