- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 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
最佳答案
您需要实现 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/
当我在 ViewController 中提供 IBOutlet 对象时,我无法在 InterfaceBuilder 中找到它们来链接到 View 中的对象。 一段时间后它会自动出现...(我已正确设置
我有一个在 Interface Builder 中正确连接的 UISearchDisplayController。 delegate = Files Owner searchBar = Search
我正在尝试找出使用 UISearchDisplayController 执行快速搜索的最佳方法。 我有一个包含超过 36000 个条目的 plist 文件。我将此文件加载到字典中,然后在该字典中执行搜
过去我一直以编程方式完成所有工作,但现在我正在尝试学习使用 Interface Builder。本身就是一种体验。 我的问题出在UISearchDisplayController上。只需将其放在我的
我有一个应用程序,它异步搜索远程 API 并使用 iOS 的 UISearchDisplayController 显示 UI。 对于已保存的搜索功能,我一直在尝试以编程方式使用 UISearchDis
我的 uisearchdisplaycontroller 遇到问题。如果我将 Controller 的搜索栏添加到 TableView 标题 View 中,它会在搜索栏上方显示一条细白线!如果我添加搜
alt text http://img210.imageshack.us/img210/5992/searchdisplaycontroller.png 以下对象可以自定义吗? 1。 UISearch
我正在尝试设置一个搜索显示 Controller 来处理来自网络服务的异步结果。我已经掌握了基本的部分,但遇到了一个非常奇怪的问题,我无法弄清楚。 似乎要为异步设置搜索显示 Controller ,您
UISearchDisplayController 非常方便,实现搜索也非常简单。 但是,当在我的应用程序中我想显示带有空搜索字符串但选定范围按钮的搜索结果时,我遇到了问题。 似乎必须输入一些搜索字符
当用户单击“搜索”按钮时,我想关闭 UISearchDisplayController,因为我正在从网络加载新数据。如何以编程方式关闭 Controller ?我已经调用了正确的方法,但不知道该怎么做
我已将 Interface Builder 中的 UITableView 行高设置为 54.0。我在该 View 上有一个 UISearchDisplayController 。当用户点击其中的搜索栏
我正在处理带有搜索栏的 View 。当搜索激活时,导航栏应该动画化(即像 -[navigationController setNavigationBarHidden:animated:]。 我已经使用
我一直在阅读有关 UISearchDisplayController 及其 delegate 的所有文档,但我找不到任何方法可以在搜索条件更改时为表格 View 设置动画。 我正在使用这两种方法: 它
谁能简单地解释一下 UISearchDisplayController 的必要性? ?我实际实现了UISearchBar在我的类里面独自一人,并使用表格 View 来显示结果。它工作正常。 我做了一个
我使用UISearchDisplayController并搜索一种禁用自动搜索的方法。 有办法吗? 最佳答案 这是您的answer,它对它的工作方式有很好的解释。我曾想过为您提供答案,但我想让您了解更
我遇到了试图在我的 UISearchDisplayController 中显示搜索结果的问题。和 TableView Controller 。 我有用于获取搜索结果的 REST API 服务器端点,当
当您没有在 UISearchDisplayController 的 UISearchBar 中输入任何文本时,它会在之前的表格上显示一个半透明的覆盖层。我想加载在这种情况下搜索时出现的表格,以显示最近
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 问题必须表现出对正在解决的问题的最低限度的理解。告诉我们您尝试过的方法、为什么不起作用以及它应该 起作用
我想在用户开始搜索之前用数据源中的所有数据加载搜索显示 Controller 的 TableView 。 我用过 [self.searchDisplayController.searchResults
我有一个 TableView ,与 UISearchDisplayController 结合使用,后者将 UISearchBar 合并到 TableView 的标题中。当用户点击键盘上的“搜索”时,我
我是一名优秀的程序员,十分优秀!