我的服务器正在处理搜索查询时,我不想显示“无结果”文本。
我想出了包含标签的表格单元格的确切坐标,并试图覆盖它。
self.noResultsCoverView = [[[UIView alloc] initWithFrame:CGRectMake(
0.0,
44.0,
320.0,
43.0
)] autorelease];
self.noResultsCoverView.backgroundColor = [UIColor whiteColor];
[self.searchDisplayController.searchResultsTableView addSubview:self.noResultsCoverView];
令我懊恼的是,我的封面位于桌面视图上方,但位于标签下方。我需要盖子在标签上方。 searchResultsTableView::bringSubviewToFront
无效,这让我相信该标签根本不是searchResultsTableView
的孩子。
答案 0 :(得分:20)
这应该可以正常工作。返回至少一个单元格的代码:
BOOL ivarNoResults; // put this somewhere in @interface or at top of @implementation
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
if (filteredList.count == 0) {
ivarNoResults = YES;
return 1;
} else {
ivarNoResults = NO;
return [filteredList count];
}
}
// {…}
// return the unfiltered array count
}
并且“显示”干净的细胞:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView == self.searchDisplayController.searchResultsTableView && ivarNoResults) {
static NSString *cleanCellIdent = @"cleanCell";
UITableViewCell *ccell = [tableView dequeueReusableCellWithIdentifier:cleanCellIdent];
if (ccell == nil) {
ccell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cleanCellIdent] autorelease];
ccell.userInteractionEnabled = NO;
}
return ccell;
}
// {…}
}
答案 1 :(得分:6)
解决此问题的最简单方法是在查询正在进行时在numberOfRowsInSection中返回1并将虚拟单元格保留为空或将其隐藏属性设置为YES以使其不可见。
答案 2 :(得分:3)
试试这个对我有用
在UISearchDisplayController委托中执行以下操作:=
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.001);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
for (UIView* v in self.searchDisplayController.searchResultsTableView.subviews) {
if ([v isKindOfClass: [UILabel class]] &&
[[(UILabel*)v text] isEqualToString:@"No Results"]) {
[(UILabel*)v setText:@""];
break;
}
}
});
return YES;
}
答案 3 :(得分:1)
您需要意识到当您拥有UISearchDisplayController
并且搜索栏处于活动状态时,传递到UITableView
数据源和委托方法的UITableView
参数实际上并非您的tableView对象,但是由UISearchDisplayController
管理的tableView,用于显示“实时”搜索结果(例如,可能从主数据源过滤掉的结果)。
您可以在代码中轻松检测到这一点,然后从委托/数据源方法返回相应的结果,具体取决于tableView对象所询问的内容。
例如:
- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section { if (tv == self.searchDisplayController.searchResultsTableView) { // return the number of rows in section for the visible search results. // return a non-zero value to suppress "No results" } else { // return the number of rows in section for your main data source } }
关键是您的数据源和委托方法正在为两个表提供服务,您可以(并且应该)检查哪个表要求数据或委派。
顺便说一句,“没有结果”是(我相信)由背景图像提供的,UISearchDisplayController
当代表说没有行时显示...你没有看到2行表,第一个空白和第二个文本“无结果”。至少,这就是我认为在那里发生的事情。