I used the UISearchController because I found out that the UISearchDisplayController out of date. But now you have a problem integrated with Chenguan's SPGooglePlacesAutocomplete forked library on GitHub.
I get a search bar when I start typing and the results are not displayed. What I am also interested in is that the UISearchDisplayController is deprecated, as the incoming Chenyuan Demo starts without warning or releasing deprecated methods.
Here is my piece of code that I tried to convert its demo to a UISearchController, please tell me where I am going wrong.
MainViewController.h
MainViewController.m snippet
// setup Search Controller -(void) setupSearchController { // The TableViewController used to display the results of a search UITableViewController *searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; searchResultsController.automaticallyAdjustsScrollViewInsets = NO; // Remove table view insets searchResultsController.tableView.dataSource = self; searchResultsController.tableView.delegate = self; // Initialize our UISearchController self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController]; self.searchController.delegate = self; self.searchController.searchBar.delegate = self; // Hint for the search self.searchController.searchBar.placeholder = @"Search your destination address"; } // Setup Search Bar -(void) setupSearchBar { // Set search bar dimension and position CGRect searchBarFrame = self.searchController.searchBar.frame; CGRect viewFrame = self.view.frame; self.searchController.searchBar.frame = CGRectMake(searchBarFrame.origin.x, searchBarFrame.origin.y, viewFrame.size.width, 44.0); // Add SearchController search bar to our view and bring it to front [self.view addSubview:self.searchController.searchBar]; [self.view bringSubviewToFront:self.searchController.searchBar]; }
continued MainViewController.m
-(void)willPresentSearchController:(UISearchController *)aSearchController { aSearchController.searchBar.bounds = CGRectInset(aSearchController.searchBar.frame, 0.0f, 0.0f); // Set the position of the result table view below the status bar and search bar // Use of instance variable to do it only once, otherwise it goes down at every search request if (CGRectIsEmpty(_searchTableViewRect)) { CGRect tableViewFrame = ((UITableViewController *)aSearchController.searchResultsController).tableView .frame; tableViewFrame.origin.y = tableViewFrame.origin.y + 64; //status bar (20) + nav bar (44) tableViewFrame.size.height = tableViewFrame.size.height; _searchTableViewRect = tableViewFrame; } [((UITableViewController *)aSearchController.searchResultsController).tableView setFrame:_searchTableViewRect]; } #pragma mark - #pragma mark UISearchDisplayDelegate - (void)handleSearchForSearchString:(NSString *)searchString { searchQuery.location = self.mapView.userLocation.coordinate; searchQuery.input = searchString; [searchQuery fetchPlaces:^(NSArray *places, NSError *error) { if (error) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Could not fetch Places" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; } else { searchResultPlaces = places; // [self.searchController.searchResultsTableView reloadData]; [[(UITableViewController *)self.searchController.searchResultsController tableView] reloadData]; } }]; } - (BOOL)searchController:(UISearchController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self handleSearchForSearchString:searchString]; // Return YES to cause the search result table view to be reloaded. return YES; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if (![searchBar isFirstResponder]) { // User tapped the 'clear' button. shouldBeginEditing = NO; [self.searchController setActive:NO]; [self.mapView removeAnnotation:selectedPlaceAnnotation]; } } - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { if (shouldBeginEditing) { // Animate in the table view. NSTimeInterval animationDuration = 0.3; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; // self.searchController.searchResultsTableView.alpha = 0.75; [(UITableViewController *)self.searchController.searchResultsController tableView].alpha = 0.75; [UIView commitAnimations]; [self.searchController.searchBar setShowsCancelButton:YES animated:YES]; } BOOL boolToReturn = shouldBeginEditing; shouldBeginEditing = YES; return boolToReturn; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [searchResultPlaces count]; } - (SPGooglePlacesAutocompletePlace *)placeAtIndexPath:(NSIndexPath *)indexPath { return searchResultPlaces[indexPath.row]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"SPGooglePlacesAutocompleteCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.font = [UIFont fontWithName:@"GillSans" size:16.0]; cell.textLabel.text = [self placeAtIndexPath:indexPath].name; return cell; } #pragma mark - #pragma mark UITableViewDelegate - (void)recenterMapToPlacemark:(CLPlacemark *)placemark { MKCoordinateRegion region; MKCoordinateSpan span; span.latitudeDelta = 0.02; span.longitudeDelta = 0.02; region.span = span; region.center = placemark.location.coordinate; [self.mapView setRegion:region]; } - (void)addPlacemarkAnnotationToMap:(CLPlacemark *)placemark addressString:(NSString *)address { [self.mapView removeAnnotation:selectedPlaceAnnotation]; selectedPlaceAnnotation = [[MKPointAnnotation alloc] init]; selectedPlaceAnnotation.coordinate = placemark.location.coordinate; selectedPlaceAnnotation.title = address; [self.mapView addAnnotation:selectedPlaceAnnotation]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { SPGooglePlacesAutocompletePlace *place = [self placeAtIndexPath:indexPath]; [place resolveToPlacemark:^(CLPlacemark *placemark, NSString *addressString, NSError *error) { if (error) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Could not map selected Place" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; } else if (placemark) { [self addPlacemarkAnnotationToMap:placemark addressString:addressString]; [self recenterMapToPlacemark:placemark]; [self requestForwardGeoCoding:[self placeAtIndexPath:indexPath].name]; // ref: https://github.com/chenyuan/SPGooglePlacesAutocomplete/issues/10 [self.searchController setActive:NO]; // [self.searchController.searchResultsTableView deselectRowAtIndexPath:indexPath animated:NO]; } }]; } @end


source share