MKLocalSearch无MKMapView

我想使用MKLocalSearch来显示一个预定义的string的结果,其结果与用户的位置相关,但是到目前为止我看到的所有例子都需要或者使用MKMapView来设置用户的位置,也许可以使用search栏来收集search所需的文本。

我只想在预定义的string上执行search,并在tableview中加载结果,而不是先有地图,有没有一个很好的例子来说明如何做到这一点?

编辑添加更多的细节,包括我目前正在尝试使用的代码。 此代码不会生成结果表。

进一步编辑:下面的Anna指出,这个问题可能是在UISearchDisplayController,但是我已经撕掉了当前的代码直接出一个工作的示例项目,所以我真的不知道哪里出了问题,或者为什么UISearchDisplayController没有显示结果。

头文件:

#import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h> @interface CallACabViewController : UIViewController <CLLocationManagerDelegate, UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate> { CLLocationManager *locationManager; MKLocalSearch *localSearch; MKLocalSearchResponse *results; } -(IBAction)closeButtonClicked:(id)sender; @end 

执行文件:

 - (void)viewDidLoad { [super viewDidLoad]; locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [self.searchDisplayController setDelegate:self]; locationManager.distanceFilter = kCLDistanceFilterNone; locationManager.desiredAccuracy = kCLLocationAccuracyBest; [locationManager startUpdatingLocation]; } #pragma mark - LocationUpdating -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *newLocation = [locations lastObject]; CLLocation *oldLocation; if (locations.count > 1) { oldLocation = [locations objectAtIndex:locations.count-2]; } else { oldLocation = nil; } NSLog(@"didUpdateToLocation %@ from %@", newLocation, oldLocation); MKCoordinateRegion userLocation = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1500.00, 1500.00); [self performSearch:userLocation]; } #pragma mark - Search Methods -(void)performSearch:(MKCoordinateRegion)aRegion { // Cancel any previous searches. [localSearch cancel]; [locationManager stopUpdatingLocation]; // Perform a new search. MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; request.naturalLanguageQuery = @"taxi"; request.region = aRegion; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; localSearch = [[MKLocalSearch alloc] initWithRequest:request]; [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; if (error != nil) { [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show]; return; } if ([response.mapItems count] == 0) { [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil) message:nil delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show]; return; } results = response; [self.searchDisplayController.searchResultsTableView reloadData]; }]; NSLog(@"DEBUG"); } #pragma mark - TableView Delegate Methods - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [results.mapItems count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *IDENTIFIER = @"SearchResultsCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:IDENTIFIER]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:IDENTIFIER]; } MKMapItem *item = results.mapItems[indexPath.row]; cell.textLabel.text = item.name; cell.detailTextLabel.text = item.placemark.addressDictionary[@"Street"]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.searchDisplayController setActive:NO animated:YES]; } -(IBAction)closeButtonClicked:(id)sender { [locationManager stopUpdatingLocation]; [self dismissViewControllerAnimated:YES completion:nil]; } @end 

我最后得到了这个工作,但没有使用提供的search表。 我存储了响应结果,然后实现了我自己的UITableView,将每个结果分配给一个单元格。