6

Tôi đã sử dụng UISearchController vì việc học rằng UISearchDisplayController không còn được dùng nữa. Nhưng bây giờ có một vấn đề, tích hợp với SPGooglePlacesAutocomplete thư viện chia hai bởi Chenyuan trong GitHub.Cách thay đổi từ UISearchDisplayController không được chấp nhận trong iOS 8.0 sang UISearchController

Tôi nhận được thanh tìm kiếm khi tôi bắt đầu nhập không có kết quả nào được hiển thị. Những gì tôi cũng tự hỏi là nếu UISearchDisplayController không được chấp nhận như thế nào, đến Chenyuan Demo chạy mà không có cảnh báo hoặc vấn đề của các phương pháp không được chấp nhận.

Đây là đoạn mã của tôi mà tôi đã cố chuyển đổi bản trình diễn của mình sang UISearchController, vui lòng cho tôi biết tôi đang đi đâu sai.

MainViewController.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
@class SPGooglePlacesAutocompleteQuery; 

@interface MainViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate, 
UISearchBarDelegate, 
UISearchControllerDelegate, 
UITableViewDataSource, 
UITableViewDelegate>{ 
    NSArray *searchResultPlaces; 
    SPGooglePlacesAutocompleteQuery *searchQuery; 
    MKPointAnnotation *selectedPlaceAnnotation; 

    BOOL shouldBeginEditing; 

@private 
    CGRect _searchTableViewRect; 
} 

// Search 
@property (strong, nonatomic) UISearchDisplayController *searchController; 
@property (strong, nonatomic) MKLocalSearch *localSearch; 
@property (strong, nonatomic) MKLocalSearchResponse *results; 

@end 

MainViewController.m đoạn mã

// 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's search bar to our view and bring it to front 
    [self.view addSubview:self.searchController.searchBar]; 
    [self.view bringSubviewToFront:self.searchController.searchBar]; 

} 

tiếp tục MainViewController.m

-(void)willPresentSearchController:(UISearchController *)aSearchController { 

    aSearchController.searchBar.bounds = CGRectInset(aSearchController.searchBar.frame, 0.0f, 0.0f); 

    // Set the position of the result's 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 
các

My Error in attempt to convert to UISearchController

App screenshot with no results predictions from google places api

Trả lời

0

Bạn cần triển khai giao thức UISearchResultsUpdating.

@interface MainViewController : UIViewController <..., UISearchResultsUpdating> 
. 
. 
. 
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { 
    // Filter results and reload table data 
} 

-(void) setupSearchController { 
    . 
    . 
    . 
    _searchController.searchResultsUpdater = self; 
} 

(như một phần, đưa kết quả địa điểm Google lên bản đồ Apple là vi phạm điều khoản sử dụng của Google, tôi tin).

Các vấn đề liên quan