2014-01-26 49 views
4

我正在使用MKLocalSearch执行地图搜索。我的问题是在响应中的MKMapItems的排序。例如,搜索我目前所在的城市将首先返回一些与城市名称相关的业务,我将不得不向下滚动一段时间才能找到实际的城市。我正在使用MKLocalSearchRequestregion属性将搜索集中在附近区域。过滤/订购MKLocalSearch响应

我的问题是:

  1. 你能效果,其中的响应返回给你的命令?例如,地图应用会在刚刚输入第一个字母后列出我的城市。没有POI或企业上榜?
  2. 有没有一种方法可以完全消除搜索中的商家,只有获得地址才能做出回应?

不知道有关与否,但这里是搜索代码:

-(void)issueLocalSearchLookup:(NSString *)searchString { 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.location.coordinate, 30000, 30000); 
    self.localSearchRequest = [[MKLocalSearchRequest alloc] init]; 
    self.localSearchRequest.region = region; 
    self.localSearchRequest.naturalLanguageQuery = searchString; 
    self.localSearch = [[MKLocalSearch alloc] initWithRequest:self.localSearchRequest]; 

    [self.localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
     if(error){ 
      NSLog(@"LocalSearch failed with error: %@", error); 
      return; 
     } else { 
      for(MKMapItem *mapItem in response.mapItems){ 
       [self.data addObject:mapItem]; 
      } 
      [self.searchDisplayController.searchResultsTableView reloadData]; 
     } 
    }]; 
} 
+0

请参见下面的链接可能是它会帮助你。 http://stackoverflow.com/questions/14950896/showing-nearby-restaurants-in-mkmap-view –

回答

4

MKLocalSearchRequest只接受naturalLanguageQuery和区域作为参数,这样你就可以“进行搜索,只有返回地址? “ - 编号

但是,在请求完成后过滤列表非常简单。如果您想从列表中筛选出企业,简单的NSPredicate可以完成这项工作。

NSPredicate *noBusiness = [NSPredicate predicateWithFormat:@"business.uID == 0"]; 
NSMutableArray *itemsWithoutBusinesses = [response.mapItems mutableCopy]; 
[itemsWithoutBusinesses filterUsingPredicate:noBusiness]; 
+1

虽然这在技术上解决了这个问题,但它在实践中通常是无用的。由于MKLocalSearch仅返回10个结果,因此在搜索后应用过滤器通常不会得到任何结果或一个或两个结果。例如,如果您搜索城市名称,您将永远不会收回,因为前10个搜索结果始终是商户。 – Joel

+0

我很困惑,苹果公司为返回的商家提供了哪些ID? – thedeveloper3124

+0

事实证明,这是一个私人的Apple框架 – thedeveloper3124

0

比使用MKLocalSearch相反,你可以使用CLGeocoder,做一个反向地理编码查询:

CLGeocoder *geo = [[CLGeocoder alloc] init]; 

[geo reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 
    // look at the placemarks and grab the locality out of them to get the city name 

}];