MKLocalSearch OHNE MKMapView

Ich möchte MKLocalSearch verwenden, um Ergebnisse für eine vordefinierte Zeichenfolge mit Ergebnissen anzuzeigen, die für die Position des Benutzers relevant sind. In allen bisher gezeigten Beispielen wird jedoch MKMapView zum Festlegen des Speicherorts des Benutzers benötigt, und möglicherweise wird die Suchleiste zum Sammeln verwendet der für die Suche benötigte Text.

Ich möchte einfach eine vordefinierte Zeichenfolge durchsuchen und die Ergebnisse in einer Tabellenansicht laden, ohne vorher eine Karte zu haben. Gibt es ein gutes Beispiel dafür?

Bearbeiten, um weitere Details hinzuzufügen, einschließlich des Codes, den ich derzeit zu verwenden versuche. Dieser Code erzeugt keine Ergebnistabelle.

Weitere Bearbeitung: Anna unten hat darauf hingewiesen, dass das Problem möglicherweise bei UISearchDisplayController liegt. Ich habe jedoch den aktuellen Code direkt aus einem funktionierenden Beispielprojekt herausgerissen, sodass ich wirklich nicht sehen kann, wo etwas schief geht oder warum UISearchDisplayController das nicht anzeigt Ergebnisse.

Header-Datei:

#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

Implementierungsdatei:

- (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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage