Ios UISearchDisplayController配置“;“没有结果”;视图不与TableFooter视图重叠
我有一个由系统提供的物品列表(例如品牌),这些物品不是用户可编辑的,但必须随时更改 上下文 这些内容显示在表视图中,可以使用默认的UISearchDisplayController进行搜索。但是,由于列表肯定不完整,我想让用户能够请求在列表中添加其他内容。 为此,我在原始表视图和搜索结果表视图中添加了一个表尾视图,它提供了一个发送邮件的按钮 问题 只要搜索结果表视图仍然包含条目,它就可以正常工作。我的表尾视图显示在搜索结果下面,一切正常 但是,如果未找到搜索项的结果,则“搜索显示”控制器会在表格视图的中心显示一个“无结果”标签。这通常看起来很棒,如下所示: 但由于我的tableFooterView仍然显示(我希望如此!)“无结果”标签与我的页脚视图重叠,看起来很糟糕: 我认为在我的例子中,我不需要“无结果”的标签,因为我的页脚视图可以合理地清楚地表明没有结果以及如何处理它。我也不介意,只要不重叠 问题: 我怎么能这样呢Ios UISearchDisplayController配置“;“没有结果”;视图不与TableFooter视图重叠,ios,uisearchdisplaycontroller,uitableview,Ios,Uisearchdisplaycontroller,Uitableview,我有一个由系统提供的物品列表(例如品牌),这些物品不是用户可编辑的,但必须随时更改 上下文 这些内容显示在表视图中,可以使用默认的UISearchDisplayController进行搜索。但是,由于列表肯定不完整,我想让用户能够请求在列表中添加其他内容。 为此,我在原始表视图和搜索结果表视图中添加了一个表尾视图,它提供了一个发送邮件的按钮 问题 只要搜索结果表视图仍然包含条目,它就可以正常工作。我的表尾视图显示在搜索结果下面,一切正常 但是,如果未找到搜索项的结果,则“搜索显示”控制器会在表格
- 使搜索视图不显示“无结果”标签
- 或配置其显示方式(->不重叠)
如果这是不可能的,我也愿意接受关于显示页脚视图(而不是页脚)的其他方式的建议,这不会有这个问题。但是我喜欢这个解决方案,因为我可以在两种情况下(普通表视图和搜索结果表视图)都使用它,而无需更改任何内容。首先,请记住,使用
UISearchDisplayController
是可定制性和方便性之间的权衡。你可以免费得到很多自动化的东西,但是如果你需要大量的定制,它可能不适合你的需要。它作为一个即时解决方案最有效,如果你真的想使用它,我建议你围绕它运行应用程序,而不是试图攻击它的行为
既然如此,为什么不让UITableView
在没有结果时返回一行呢?这一行可以是空的,显示一些样板文本或图像(悲伤的脸或与应用程序相匹配的幽默)
如果只显示一行,则不会显示UISearchDisplayController
中的默认“无结果”标签。这是许多应用程序的默认行为,如Instagram(查看“浏览”选项卡)、Kindle和default Notes.app,尽管它们可能没有使用UISearchDisplayController
如果您发现此解决方案不适合您的应用程序,您还可以尝试将“缺少品牌”视图设置为UISearchResultsTableView
第一部分的页眉视图(而不是页脚视图)。这样,“无结果”标签将显示在其下方。将此想法与一个空行相结合会更好
第三个选项是在UISearchResultsTableView
顶部插入此视图。这可以在每次没有结果时(必要时正确删除)或仅一次使用其hidden属性显示或隐藏结果时执行
隐藏此标签的任何其他方法都可能有问题,如以下方法:。尽管您当前的逻辑比较简单,但以后可能会产生负面影响,因此这可能是最糟糕的选择。使用UISearchBar它不会隐藏导航栏 导入UISearchBar委托
不要忘记将代理连接到搜索栏
[yourSearchbar setDelegate:self]
然后添加这些委托方法
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
// Put here in search what you want.
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)aSearchBar
{
[aSearchBar resignFirstResponder];
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
[searchBar setShowsCancelButton:YES animated:YES];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
[searchBar resignFirstResponder];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
[searchBar resignFirstResponder];
}
我所做的是检测是否有0个结果。如果结果为0,我将numberOfRowsInSection更改为返回1,将HeightForRowatineXpath更改为返回0,将CellForRowatineXpath更改为返回通用UITableViewCell
就这样。页脚显示在所有的荣耀中。我很乐意向您展示我的解决方案 首先我写了一些分类。第一类为我们提供了
UISearchDisplayController
表
@interface UITableViewController (YourUITableViewControllerCategory)
- (UITableView *) tableViewSearch;
@end
@implementation UITableViewController (YourUITableViewControllerCategory)
- (UITableView *) tableViewSearch
{
if ([self respondsToSelector:@selector(searchDisplayController)])
{
id searchDisplayController = [self performSelector:@selector(searchDisplayController)];
if ([searchDisplayController respondsToSelector:@selector(searchResultsTableView)])
{
id searchResultsTableView = [searchDisplayController performSelector:@selector(searchResultsTableView)];
if ([searchResultsTableView isKindOfClass:[UITableView class]]) return searchResultsTableView;
}
}
return [UITableView new];
}
@end
第二类返回特定类型的子视图数组
@interface UIView (YourUIViewCategory)
- (NSArray *) viewsWithClass:(NSString *)class;
@end
@implementation UIView (YourUIViewCategory)
- (NSArray *) viewsWithClass:(NSString *)class
{
NSMutableArray *array = [NSMutableArray new];
for (UIView *view in self.subviews)
{
if ([view isMemberOfClass:NSClassFromString(class)])
{
[array addObject:view];
}
[array addObjectsFromArray:[view viewsWithClass:class]];
}
return array;
}
@end
现在您几乎可以搜索“无结果”标签了。您必须确保单元格中的所有标签都有标记!=0
- (BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
for (UILabel *label in [self.tableViewSearch viewsWithClass:NSStringFromClass([UILabel class])])
{
if (label.tag == 0)
{
// found it! do whatever you want with label
}
}
return NO;
}
这只是我的方法。你可以找到自己的路。祝你好运 使用下面的代码删除“无结果”文本值
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
if (!isChangedNoResults) {
if ([contactManager.filteredPeople count] == 0) {
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(changeNoResultsText:) userInfo:nil repeats:YES];
}
}}
更改文本方法
- (void) changeNoResultsText:(NSTimer *)timer {
if (isChangedNoResults) {
[timer invalidate];
}
else {
for (UIView *subview in [self.searchDisplayController.searchResultsTableView subviews]) {
if ([subview isKindOfClass:[UILabel class]]) {
UILabel *targetLabel = (UILabel *)subview;
if ([targetLabel.text isEqualToString:@"No Results"]) {
NSLog(@"Changed!");
[targetLabel setText:@"_____"];
isChangedNoResults = YES;
[timer invalidate];
}
}
}
}
}
或者在搜索方法中执行以下代码
-(BOOL)searchDisplayController:(UISearchDisplayController*)控制器
shouldReloadTableForSearchString:(NSString*)searchString{
这对我真的很有帮助,,,,,试试吧非常感谢你提出的一些好建议。总是返回一行也有点不对劲。我第一次考虑将我的MissingBrand视图添加为一个附加单元格或节页脚,但感觉不对。如果将其设置为节页脚,我可以肯定它将始终位于节页脚的最后一个单元格下方表视图,而不必做额外的(可能容易出错的)工作。我认为我应该保留没有结果的状态信息(例如,可访问性)并且只显示一些额外的UI。关于不同的想法:黑客非常愚蠢,是的。返回额外的单元格不太容易出错,所以我宁愿这样做。我尝试将其添加为表头视图,但在这种情况下,它显示在“无结果”上方,但搜索结果不再显示。不知道为什么(我所做的更改是将其指定给
tableHeaderView
而不是tableFooterView
)。关于第三个选项:如何可靠地将视图插入到search display Controller表视图的顶部?它只是被覆盖
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;
}
}
});