gpt4 book ai didi

ios - 如何从 iOS 8.0 中弃用的 UISearchDisplayController 更改为 UISearchController

转载 作者:可可西里 更新时间:2023-11-01 04:01:34 24 4
gpt4 key购买 nike

我使用 UISearchController 因为了解到 UISearchDisplayController 已被弃用。但是现在有问题,与SPGooglePlacesAutocomplete整合Chenyuan 在 GitHub 上的 fork 库。

开始输入时出现搜索栏,但未显示任何结果。我还想知道的是,如果不推荐使用 UISearchDisplayController,如何在没有警告或不推荐使用方法的情况下运行 Chenyuan Demo。

这是我试图将他的演示转换为 UISearchController 的代码片段,请告诉我哪里出错了。

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 片段

  // 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];

}

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

My Error in attempt to convert to UISearchController

App screenshot with no results predictions from google places api

最佳答案

您需要实现 UISearchResultsUpdating协议(protocol)。

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

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

(顺便说一句,我认为将 Google 地点结果放到 Apple map 上违反了 Google 的使用条款)。

关于ios - 如何从 iOS 8.0 中弃用的 UISearchDisplayController 更改为 UISearchController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com