Iphone UISearchDisplayContoller&x2013;can';t防止在搜索栏中键入时重新加载表
我正在尝试设置一个搜索显示控制器来处理来自web服务的异步结果。我已经准备好了基本的部分,但是遇到了一个我无法理解的非常奇怪的问题 似乎要为async安装搜索显示控制器,您只需做两件事:Iphone UISearchDisplayContoller&x2013;can';t防止在搜索栏中键入时重新加载表,iphone,uitableview,uisearchbar,uisearchdisplaycontroller,Iphone,Uitableview,Uisearchbar,Uisearchdisplaycontroller,我正在尝试设置一个搜索显示控制器来处理来自web服务的异步结果。我已经准备好了基本的部分,但是遇到了一个我无法理解的非常奇怪的问题 似乎要为async安装搜索显示控制器,您只需做两件事: 返回否 searchDisplayController:应重新加载搜索字符串的表, 及 手柄searchBarSearchButtonClicked 然后从桌子上开火 我自己 我正在执行这两项操作,但我看到的是,搜索显示控制器在搜索栏中键入的第一个字符上重新加载表,即使我根据#1返回NO。它不会在随后输入的字符
#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
return NO;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
return NO;
}
#pragma mark -
#pragma mark UISearchBarDelegate Methods
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self.searchDisplayController.searchResultsTableView reloadData];
}
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [self.searchDisplayController.searchBar.text stringByAppendingFormat:@" #%d", indexPath.row];
return cell;
}
谢谢!(顺便说一句,这是我在这里问的第一个问题,如果我错过了任何礼仪要点,请告诉我:)也许你需要实现
UISearchDisplayController
,然后这个功能:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
不幸的是,我相信这正是
UISearchDisplayController
的工作原理。如果你想请求不同的功能选项,你应该向苹果提交一份bug报告
另一种方法是编写您自己的UISearchBar
和UITableView
组合,类似于UISearchDisplayController
的工作方式,这样您可以获得更好的控制
希望这有帮助 这正是UISearchDisplayController(SDC)的工作方式。当用户在搜索栏中输入第一个字符时,将首次加载并显示searchTable,从而使其加载。方法“…shouldReloadTableForSearchString”和“…shouldReloadTableForSearchScope”允许您控制是在后续字符上自动重新加载搜索表还是在范围更改时自动重新加载搜索表 为了在第一个角色上提供良好的用户体验,我已经完成了以下两项工作。免责声明:我确实有这两种方法的实现,但这只是一个从我的记忆中实现的框架。我可能错过了一个细节,但这会让你很接近 选项1:键入第一个字符时,在搜索表中显示一个“加载”单元格。 此选项允许SDC在用户键入第一个字符时显示searchResultsTableView,显示当前搜索/筛选操作的状态
- 添加iVar
BOOL isLoading
- 添加iVar
UITableView*searchTableView
searchDisplayController:didLoadSearchResultsTableView
- 设置
searchTableView=tableView
中,应重新加载搜索字符串/范围的表
- 设置
isLoading=YES
- 调用您的方法在后台加载数据
- 返回号
- 设置
isLoading=NO
[searchTableView重新加载数据]
- 如果存在当前搜索结果,则显示结果(即使在后台加载/筛选)
- 如果没有搜索结果且
返回1行并在单元格中显示“无匹配项”isLoading==no
- 如果没有搜索结果且
返回1行并在单元格中显示搜索活动(我通常使用UIActivityIndicatorView)isLoading==YES
- 与选项1相同
- 添加iVar
UIView*searchTableOverlayView
searchDisplayController:didLoadSearchResultsTableView
- 与选项1相同
- 创建一个UIView以用作覆盖,代替searchTableView,其中包含适用于您的应用程序的任何UI,并将其设置为
searchTableOverlayView
searchDisplayController:didUnloadSearchResultsTableView
- 发布
searchTableOverlayView
中(可以在
searchDisplayController:willShowSearchResultsTableView中执行此操作`
- 如果要显示搜索结果或
isLoading==NO
seachTableOverlayView.hidden==YES
newView.frame = frame; [view addSubview:newView];
if (view == currentView) return; view.frame = currentView.frame; view.alpha = [self getAlphaValueForView:view]; UIView * superView = [currentView superview]; [currentView removeFromSuperview]; currentView = view; [superView addSubview:currentView];
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView; { tableView.hidden = YES; }
self.searchDisplayController.searchResultsTableView.hidden = NO; [self.searchDisplayController reloadData]