系统地图 API 位置提示搜索

最近需要做一个带有位置搜索功能的界面,具体需求就是输入一个位置,能够自动联想出一串与之匹配的地名,供用户选择。在实际应用中,有许多APP都具有此类功能,比如微信朋友圈或者QQ空间的状态的位置,可以自动定位或手动输入,手动输入的时候会根据输入文字的变化,展示一个位置列表。

想实现这个功能,且不导入第三方的SDK(如果导入第三方地图SDK,会使应用安装包增加10M左右),使用iOS系统自带的高德地图API就能够轻松办到。

首先,导入MapKit框架

#import <MapKit/MapKit.h>

如果用不到MapKit框架中其他的API的话,可以单独导入以下框架

#import <MapKit/MKLocalSearch.h>
#import <MapKit/MKLocalSearchRequest.h>
#import <MapKit/MKLocalSearchResponse.h>

然后在输入文字变化所调用的方法里,实现下列关键方法

	//创建搜索请求对象
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc]init];
    //把文字赋值给这个自然语言查询的属性,我为了方便演示,在这里写死了一个值
    request.naturalLanguageQuery = @"财富广场";
    //创建搜索对象
    MKLocalSearch *localSearch = [[MKLocalSearch alloc]initWithRequest:request];
    __weak __typeof (&*self) weakSelf = self;
    //开始搜索的回调方法
    [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
        if (error) {
            //do something
        }else{
            //遍历结果数组
            [response.mapItems enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                //位置对象,包含地理位置的名称、地址、经纬度等详细信息,根据需要获取具体值
                MKMapItem *mapItem = obj;
                //以下为我实现列表展示功能所写的代码
                JXLMapResultModel *model = [JXLMapResultModel new];
                model.name = mapItem.name;
                [weakSelf.modelArray addObject:model];
                if (response.mapItems.count == idx + 1) {
                    [weakSelf.tableView reloadData];
                }
            }];
        }
    }];

最终可以实现这样的效果