基础很简单:只需<UISearchBarDelegate,UISearchDisplayDelegate>
在表视图控制器中实现。这是一个足够的教程。
诀窍是要意识到有两个控制器:一个表格视图控制器和一个搜索显示控制器。每个控制器都有自己的表格视图。因此有两个表视图在起作用:普通表视图和搜索显示表视图。当委托方法有一个 UITableView 参数时,区分传入哪个表视图,并相应地做不同的事情。
除了以上基础知识,数据结构成为我的主要挑战。更具体地说,如何过滤和存储搜索结果?我们有三个选择:
一个。
一个用于普通表视图的 FRC
创建一个数组属性来存储结果
用于
filteredArrayWithPredicate
过滤获取的对象(数组)为 FRC 指定缓存以将获取的对象存储在内存中以提高性能
B.
一个用于普通表视图的 FRC
修改 FRC 的谓词来做过滤。Apple doc 指示执行此操作的 3 个步骤:
- 删除 FRC 缓存(最好不要一开始就使用)
- 更改谓词
- 调用 performFetch
C。
两个 FRC,每个表视图一个。此热门帖子的已接受答案中提供了详细的实现
我认为A是正确的方法。我的理由包括:
A 把所有的工作都做好了。它只需要对具有 FRC 属性的表视图控制器进行微不足道的更改。更具体地说,只需在每个委托方法中区分两个表视图,并添加一个 NSArray 属性来存储获取结果。当然,还要添加过滤代码。
B 有一个潜在的缺点:FRC 委托方法会混淆正在使用哪个获取请求?是在搜索之前,还是在搜索期间,还是在搜索之后?尽管可能有解决方案,但如果解决方案 A 有效,我认为不值得花时间。
第二个缺点是,如果我们想要动态更改搜索结果。用户在搜索栏中输入的每个字母都会导致 FRC 执行 Fetch,这是相当昂贵的。
C 通过使用两个 FRC 避免了 B 的第一个缺点,但出于完全相同的原因它遭受了第二个缺点。
其他需要考虑的事项:
在后台队列中进行过滤。因此,当用户在搜索栏中输入内容时,无论您的过滤成本多么昂贵,屏幕都不会被屏蔽。
创建一个辅助方法来区分两个表视图。在相关的委托方法中调用辅助方法,可以使代码更简洁。
以上是我对在表格视图中实现搜索的理解。如有错误,请帮忙指出。非常感谢。