UISearchBar 在搜索没有结果时显示标签,但在单击 UISearchBar 中的 x 时不会再次隐藏标签

Posted

技术标签:

【中文标题】UISearchBar 在搜索没有结果时显示标签,但在单击 UISearchBar 中的 x 时不会再次隐藏标签【英文标题】:UISearchBar displaying a label when a search produces no results, but not hiding the label again when the x in the UISearchBar is clicked 【发布时间】:2014-04-11 07:03:39 【问题描述】:

我有一个小情况,我似乎无法克服。

我有一个 UITableView,它在顶部嵌入了一个 UISearchBar。 TableView 由 NSFetchedResultsController 和 CoreData 填充。

应用程序第一次启动时,没有数据,如果用户尝试搜索,我启用了在屏幕中间显示“未找到结果”的标签。但是,如果用户单击 UISearchBar 中的 x,它会清除搜索但不会再次隐藏标签。

我没有 UISearchBar 的取消按钮(它只是 x),并且我实现了在搜索处于活动状态时隐藏导航栏按钮的使用。

考虑到这一点,我已将问题范围缩小到 textDidChange 方法,但当用户按下 x 时,无论是否按下键盘,我似乎都无法隐藏标签。

我希望有人能对此有所了解!

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

    self.eventSearchBar.showsCancelButton = NO;
    if ([self.eventSearchBar.text length] > 0)
    
        self.addButton.enabled = NO;       
    

    // This code seems to have no effect at all
    if ([searchText length] == 0)
    
        self.noResultsLabel.hidden = YES;
    
    _fetchedResultsController = nil;
    NSError *error;

    if (![[self fetchedResultsController] performFetch:&error])
    

    
    else
    
        [self.eventTableView reloadData];
        [self.noResultsLabel setHidden:_fetchedResultsController.fetchedObjects.count > 0];
        if (![self.eventSearchBar isFirstResponder])
        
            self.shouldBeginEditing = NO;
            [self.eventTableView reloadData];
            [self.eventSearchBar resignFirstResponder];
        
    

更新:两张图片

任何指导将不胜感激!

【问题讨论】:

你为什么不尝试使用UISearchDisplayController 感谢 Himanshu - 我现在对我的应用程序进行更改太远了,在我准备将我的应用程序更新到 App Store 之前我只是遇到了这个小问题.. 所以我可能会考虑它未来,但现在,这个小问题需要我用这种方法关注,我觉得我最多错过一两行 您想在按钮操作时清除搜索栏的文本字段? UISearchBar x 已经在清除搜索。我想要发生的是,当你按下 x 时,标签也会隐藏起来。 能否提供屏幕截图? 【参考方案1】:

我已经成功地按照我的意愿完成了这项工作。

我发现我的 textDidChange 中的以下代码在键盘仍然打开并且用户按下 x 按钮时起作用:

    if (![self.eventSearchBar isFirstResponder])
    
        self.shouldBeginEditing = NO;
        [self.eventTableView reloadData];
        [self.eventSearchBar resignFirstResponder];
    

所以在这里,我把 self.noResultsLabel.hidden = YES;

如果键盘是第一响应者并且用户按下 x,我还想隐藏 noResultsLabel,我做了以下操作:

    if ([self.eventSearchBar isFirstResponder] && ([self.eventSearchBar.text length] == 0))
    
        self.noResultsLabel.hidden = YES;
        self.addButton.enabled = YES;

        [self.eventTableView reloadData];
    

现在,用户可以按下 UISearchBar 中的 x 按钮,如果它显示键盘是否是 firstResponder,它将隐藏 noResultsLabel。

感谢大家的帮助。

【讨论】:

【参考方案2】:

您只需检查搜索文本长度是否为 0 的条件,如果长度为 0 则隐藏该标签。

/** 当文本改变(包括清除)时调用 */

(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText1

if ([searchText1 长度] == 0)

   //Hide The label

【讨论】:

感谢@VMC501 和 vipul 的帮助。当然,我已经得到了它与我对这个问题的回答。如果可以,我会在 2 天内接受。感谢您抽出宝贵时间。 请在下面发布您的工作答案,以便对其他人有所帮助

以上是关于UISearchBar 在搜索没有结果时显示标签,但在单击 UISearchBar 中的 x 时不会再次隐藏标签的主要内容,如果未能解决你的问题,请参考以下文章

单击搜索结果时显示空的详细信息视图

将 UISearchBar 与表视图控制器一起使用并转到另一个视图时显示问题

在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画

防止 TableView Header 在执行 [uitableView reloadData] 时显示

iOS:如何在另一个表格视图中显示搜索结果?以及如何在搜索时显示建议?

使用 UISearchDisplayController 时显示搜索结果崩溃