UISearchDisplayController配置“无结果”视图不与tableFooterView重叠

时间:2014-04-05 23:04:53

标签: ios uisearchdisplaycontroller uitableview

我有一个由系统提供的东西列表(例如品牌),这些东西不是用户可编辑的,但必须不时更改。

上下文

这些内容显示在表视图中,可使用默认的UISearchDisplayController进行搜索。但是,由于事情列表肯定还没有完成,我想让用户能够请求在列表中添加其他内容。 为此,我在原始表格视图和搜索结果表格视图中添加了一个表格页脚视图,该视图提供了一个发送邮件的按钮。

问题

只要搜索结果表视图仍包含条目,它就可以正常工作。我的表页脚视图显示在搜索结果下方,一切正常。

但是,如果没有找到搜索词的结果,搜索显示控制器会显示" no result"标签以表格视图为中心。这通常看起来很棒,如下:

default "no results" screen

但是因为我的tableFooterView仍然显示(我想要它!)"没有结果"标签与我的页脚视图重叠,看起来很糟糕:

enter image description here

我认为在我的情况下,我不需要"没有结果"标签,因为我的页脚视图清楚地表明没有结果以及如何处理它。我也不介意,只要它不重叠。

问题

我怎么能

  • 使搜索视图不显示"无结果"标签
  • 或配置它的显示方式( - >不重叠)

如果无法做到这一点,我也会建议其他方式显示页脚视图(而不是页脚),这样就不会出现此问题。但我喜欢这个解决方案,因为我可以在两种情况下使用它(普通表视图和搜索结果表视图)而不必改变任何东西。

5 个答案:

答案 0 :(得分:5)

首先,请务必记住,使用UISearchDisplayController是可定制性和便利性之间的权衡。你可以免费获得大量的自动化东西,但如果你需要大量的自定义,它可能不适合你的需求。它最适合用作插入式解决方案,如果您真的想使用它,我建议您使用它来运行应用程序,而不是试图破解它的行为。

话虽如此,为什么在没有结果时你不让UITableView返回一行?这行可以是空的,显示一些样板文本或图像(悲伤的脸或与应用程序匹配的幽默)。

要显示一行,默认为"无结果"来自UISearchDisplayController的标签不会显示。这是许多应用程序的默认行为,例如Instagram(查看“浏览”选项卡),Kindle和默认的Notes.app,尽管它们可能没有使用UISearchDisplayController

如果您发现此解决方法不适合您的应用,您还可以尝试制作"错过品牌"查看UISearchResultsTableView的第一部分的标题视图(而不是页脚视图)。这样,"没有结果"标签将显示在它下面。将这个想法与一个空行结合起来甚至会更好。

第三种选择是将此视图插入UISearchResultsTableView之上。这可以在每次没有结果(在必要时正确删除它)或只是一次时使用其隐藏属性来显示或隐藏它。

隐藏此标签的任何其他方法都可能很糟糕,例如:https://stackoverflow.com/a/11715841/382834。虽然你现在的逻辑比较容易,但以后可能会产生负面影响,所以它可能是最糟糕的道路。

答案 1 :(得分:0)

使用UISearchBar它不会隐藏导航栏

导入UISearchBar委托<UISearchBarDelegate>

不要忘记将代理人与搜索栏联系起来

[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];
}

答案 2 :(得分:0)

我所做的是检测是否有0结果。如果有0个结果,我将numberOfRowsInSection更改为1,heightForRowAtIndexPath返回0,cellForRowAtIndexPath返回通用UITableViewCell。

就是这样。页脚显示在它的所有荣耀中。

答案 3 :(得分:0)

我很乐意向您展示我的解决方案。

首先我写了一些类别。第一个类别为我们提供了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

现在您已准备好搜索“无结果”标签。您必须确保单元格中的所有标签都有tag != 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;
}

这只是我的方法。你可以找到自己的方式。祝你好运!

答案 4 :(得分:0)

使用以下代码删除&#34;无结果&#34;文字值

- (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 {

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;
        }
    }
});

对我来说真有帮助,,,试试吧