Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UISearchDisplayController配置“;“没有结果”;视图不与TableFooter视图重叠_Ios_Uisearchdisplaycontroller_Uitableview - Fatal编程技术网

Ios UISearchDisplayController配置“;“没有结果”;视图不与TableFooter视图重叠

Ios UISearchDisplayController配置“;“没有结果”;视图不与TableFooter视图重叠,ios,uisearchdisplaycontroller,uitableview,Ios,Uisearchdisplaycontroller,Uitableview,我有一个由系统提供的物品列表(例如品牌),这些物品不是用户可编辑的,但必须随时更改 上下文 这些内容显示在表视图中,可以使用默认的UISearchDisplayController进行搜索。但是,由于列表肯定不完整,我想让用户能够请求在列表中添加其他内容。 为此,我在原始表视图和搜索结果表视图中添加了一个表尾视图,它提供了一个发送邮件的按钮 问题 只要搜索结果表视图仍然包含条目,它就可以正常工作。我的表尾视图显示在搜索结果下面,一切正常 但是,如果未找到搜索项的结果,则“搜索显示”控制器会在表格

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

上下文 这些内容显示在表视图中,可以使用默认的UISearchDisplayController进行搜索。但是,由于列表肯定不完整,我想让用户能够请求在列表中添加其他内容。 为此,我在原始表视图和搜索结果表视图中添加了一个表尾视图,它提供了一个发送邮件的按钮

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

但是,如果未找到搜索项的结果,则“搜索显示”控制器会在表格视图的中心显示一个“无结果”标签。这通常看起来很棒,如下所示:

但由于我的tableFooterView仍然显示(我希望如此!)“无结果”标签与我的页脚视图重叠,看起来很糟糕:

我认为在我的例子中,我不需要“无结果”的标签,因为我的页脚视图可以合理地清楚地表明没有结果以及如何处理它。我也不介意,只要不重叠

问题: 我怎么能这样呢

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

如果这是不可能的,我也愿意接受关于显示页脚视图(而不是页脚)的其他方式的建议,这不会有这个问题。但是我喜欢这个解决方案,因为我可以在两种情况下(普通表视图和搜索结果表视图)都使用它,而无需更改任何内容。

首先,请记住,使用
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;
        }
    }
});