如何在保持 UISearchBar 处于活动状态的同时强制 UITableView 重新加载数据?

Posted

技术标签:

【中文标题】如何在保持 UISearchBar 处于活动状态的同时强制 UITableView 重新加载数据?【英文标题】:How can I force a UITableView to reloadData while keeping a UISearchBar active? 【发布时间】:2011-03-03 23:10:58 【问题描述】:

我有一个包含 20 个部分的 UITableView。在顶部我有一个 UISearchBar,我想在用户输入时过滤这些部分。

不幸的是,如果 UISearchBar 处于活动状态并且如果我从 searchBarShouldEndEditing 返回 NO:那么我的 [tableView reloadData] 调用将被忽略。如果我从 searchBarShouldEndEditing: 返回 YES,那么 reloadData 调用工作正常,但在输入每个字符后我会丢失 firstResponder。

如何强制 UITableView 进行实时更新和过滤,而不必在输入的每个字符之间在 UISearchBar 上 resignFirstResponder?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,最终得到了一个非常优雅的解决方案:

您将搜索栏放在表格的特定部分(比如说索引 0)。您将表数据放在另一个部分(比如说索引 1)。

当你的搜索栏文本改变时,你可以更新你的模型,然后简单地调用:

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:1];
[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

这样,您的键盘仍将处于活动状态,您的搜索栏仍将是第一响应者,并且您将受益于漂亮的内置表格动画!

【讨论】:

viewWillAppear 可以吗? 我已经这样做了,问题仍然存在,并且强制 becomeFirstResponder 有一个小故障......它最终作为 tableHeaderView 工作,而不是部分标题视图......干杯【参考方案2】:

您可以通过使用UISearchDisplayController 并为其提供相同的数据源来节省大量工作。它管理搜索栏和自己的表格视图以显示过滤结果。

【讨论】:

这不是我想要的,但是对于它节省的实现麻烦的数量可能已经足够接近了。谢谢。【参考方案3】:

我有类似的问题。事实证明,这与我在表格重新加载数据时使用的动画有关。当我删除reloadSections:withRowAnimation,并简单地调用:

[self.tableView reloadData];

搜索栏不再调用带有动画的更高级的方法来刷新表格数据,而是不再根据输入的任何键退出第一响应者。

希望这会有所帮助...

【讨论】:

你是如何关闭动画的? @Joey,我所做的是删除“reloadSections:withRowAnimation”并改用“reloadData”。我同意“关闭动画”不是一个正确的术语。

以上是关于如何在保持 UISearchBar 处于活动状态的同时强制 UITableView 重新加载数据?的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar 在活动时与 UITableView 内容重叠

如何在 Android 中服务 onDestroy 后保持对象变量处于活动状态?

如何在回发 ASP.Net Core 后保持选项卡处于活动状态

计时器:如何在后台保持计时器处于活动状态

如何在 AJAX 调用之间保持 PHP 对象处于活动状态(或在内存中)

如何在后台保持 iphone ios websocket 连接处于活动状态?