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

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

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

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

【问题讨论】:

    标签: iphone cocoa-touch uitableview uisearchbar ios-4.2


    【解决方案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”。我同意“关闭动画”不是一个正确的术语。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2020-12-30
    • 2023-01-25
    • 2014-10-05
    • 2015-05-14
    • 2022-06-28
    相关资源
    最近更新 更多