如何在保持 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 后保持选项卡处于活动状态