通常,UISearchDisplayController在激活时会使tableView变暗并聚焦searchBar。只要在searchBar中输入文本,它就会创建一个searchResultsTableView,它在searchBar和键盘之间显示。当第二个UITableView被加载/显示/隐藏/卸载时,将调用searchDisplayController的委托。通常它会在输入时显示实时搜索结果或自动填充条目。
在我的应用中,我想搜索网络服务,我不想为用户输入的每个字母调用网络服务。因此,我想完全禁用searchResultsTableView并在输入文本时保持暗灰色覆盖。然后,一旦他点击搜索按钮,我就会触发搜索(带加载屏幕)。
只为searchResultsTableView返回零行看起来不太好,因为它显示一个带有“无结果”消息的空searchResultsTableView。我试图隐藏表格(searchDisplayController:didLoadSearchResultsTableView:
),但是黑色的灰色叠加层也是隐藏的,以便底层的tableView再次完全可见。
除了从头开始重新创建UISearchDisplayController功能之外的任何想法吗?
答案 0 :(得分:38)
这是我刚才想到的一个小技巧 并且您还必须在编辑searchstring
时返回0结果- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
savedSearchTerm = searchString;
[controller.searchResultsTableView setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.8]];
[controller.searchResultsTableView setRowHeight:800];
[controller.searchResultsTableView setScrollEnabled:NO];
return NO;
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
// undo the changes above to prevent artefacts reported below by mclin
}
我想你会明白下一步该做什么
答案 1 :(得分:19)
你试过这个:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(_lookup:) object:nil];
[self performSelector:@selector(_lookup:) withObject:txt afterDelay:0.20];
这样,如果用户在1/5秒内键入另一个char,则只进行一次Web呼叫。
答案 2 :(得分:9)
上述任何内容似乎都不能正常运行,所以我提出了以下内容(当您准备好显示结果时,必须调用removeTableHeader):
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
[self setTableHeader];
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
[self setTableHeader];
}
- (void)setTableHeader {
UIView *headerView = [[UIView alloc] initWithFrame:self.searchDisplayController.searchResultsTableView.frame];
headerView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];
[self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
[self.searchDisplayController.searchResultsTableView setScrollEnabled:NO];
[self.searchDisplayController.searchResultsTableView setTableHeaderView:headerView];
[headerView release];
}
- (void)removeTableHeader {
[self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
[self.searchDisplayController.searchResultsTableView setScrollEnabled:YES];
[self.searchDisplayController.searchResultsTableView setTableHeaderView:nil];
}
显然,它使表格透明,添加一个与表格大小相同的黑色/半透明表格标题,并禁止在表格上滚动,这样就无法超出或超过标题。作为奖励,您可以在标题视图中添加一些内容('请稍候......'或活动指示符)。
答案 3 :(得分:9)
与您有同样的问题,我通过 a)处理它,在开始搜索时将searchResultsTableView的alpha设置为0,然后通过 b)添加/删除overlayView到viewController的视图。对我来说就像是一种魅力。
@interface MyViewController()
//...
@property(nonatomic, retain) UIView *overlayView;
//...
@end
@implementation MyViewController
@synthesize overlayView = _overlayView;
//...
- (void)viewDidLoad
{
//...
//define your overlayView
_overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480)];
_overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.8];
}
//hide the searchResultsTableView
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
self.searchDisplayController.searchResultsTableView.alpha = 0.0f;
}
//when ending the search, hide the overlayView
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
[_overlayView removeFromSuperview];
}
//depending on what the user has inputed, add or remove the overlayView to the view of the current viewController
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString length]>0)
{
[self.view addSubview:_overlayView];
}
else
{
[_overlayView removeFromSuperview];
}
return NO;
}
@end
答案 4 :(得分:2)
在UISearchDisplayDelegate中实现以下方法应该足够了(通常是你的自定义UITableViewController子类)
- (BOOL) searchDisplayController: (UISearchDisplayController *) controller shouldReloadTableForSearchString: (NSString *) searchString
{
[self startMyCustomWebserviceSearchAsBackgroundProcessForString: searchString]; //starts new NSThread
return NO;
}
你试过这个吗?
答案 5 :(得分:2)
基于user182820的代码是我的版本。我隐藏了UISearchDisplayController的表视图。当在搜索框中输入一个字符时,我放置一个“暗淡的视图”,使其看起来像UISearchDisplayController的“暗视图”从未消失,然后在搜索完成后将其删除。如果您输入一些字符并按取消,表格视图会全部变为白色,我不知道如何解决此问题。
- (void)viewDidLoad {
...
tableViewMask=[UIView new];
tableViewMask.backgroundColor = [UIColor blackColor];
tableViewMask.alpha = 0.8;
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
tableViewMask.frame=CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+controller.searchBar.frame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height-controller.searchBar.frame.size.height);
controller.searchResultsTableView.hidden=YES;
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
[tableViewMask removeFromSuperview];
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
if (searchString.length==0)
[tableViewMask removeFromSuperview];
else
[self.tableView addSubview:tableViewMask];
[searchText autorelease];
searchText=[searchString retain];
return NO;
}
答案 6 :(得分:2)
如此简单地做到这一点:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
self.searchDisplayController.searchResultsTableView.hidden=YES;
return YES;
}
对我来说很好..
答案 7 :(得分:1)
我发现了一种更好的方法,因为“最佳答案”存在错误 - 滚动黑色背景表时将显示分隔符和“无结果”。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
controller.searchResultsTableView.backgroundColor = [UIColor blackColor];
controller.searchResultsTableView.alpha = 0.8;
controller.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
for(UIView *subview in tableView.subviews) {
if([subview isKindOfClass:UILabel.class]) {
subview.hidden = YES;
}
}
return NO;
}
- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
self.searchDisplayController.searchResultsTableView.backgroundColor = [UIColor whiteColor];
self.searchDisplayController.searchResultsTableView.alpha = 1;
self.searchDisplayController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
for(UIView *subview in tableView.subviews) {
if([subview isKindOfClass:UILabel.class]) {
subview.hidden = NO;
}
}
// search results and reload data ....
}
答案 8 :(得分:1)
所有现有的答案都过于复杂。您可以立即隐藏结果表视图。
-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
tableView.hidden = YES;
}
答案 9 :(得分:0)
我认为我找到了一个更好的实现此问题。以前的所有答案都正确显示了一个与搜索前UITableView相似的灰色视图,但每个解决方案都缺少点击该区域以取消搜索的功能。
出于这个原因,我认为这段代码效果更好。
首先,创建一个BOOL,例如searchButtonTapped,以指示是否点按了搜索按钮。默认情况下,它是NO。
然后:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if (!searchButtonTapped) {
// To prevent results from being shown and to show an identical look to how the tableview looks before a search
[controller.searchResultsTableView setBackgroundColor:[UIColor clearColor]];
[controller.searchResultsTableView setRowHeight:160];
self.searchDisplayController.searchResultsTableView.scrollEnabled = NO;
} else {
// Restore original settings
[controller.searchResultsTableView setBackgroundColor:[UIColor whiteColor]];
[controller.searchResultsTableView setRowHeight:44];
self.searchDisplayController.searchResultsTableView.scrollEnabled = YES;
}
return YES;
}
现在应根据其他答案明确这一点。当用户点击“搜索”按钮时,请务必恢复原始设置。
此外,在cellForIndexPath方法中添加:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.contentView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8];
为了创建在输入文本之前显示的相同灰色视图。确保将这些属性应用于正确的单元格,即检查哪个UITableView处于活动状态,以及用户是否未点击“搜索”按钮。
然后,至关重要的是,在didSelectRowAtIndexPath:
中if (tableView == self.searchDisplayController.searchResultsTableView) {
if (searchButtonTapped) {
// Code for when the user select a row after actually having performed a search
{
else
[self.searchDisplayController setActive:NO animated:YES];
现在用户可以点击灰色区域,这不会导致UITableViewCell的可见选择,而是取消搜索。