0

尝试将 UITableView 子类化以具有内置搜索功能是否可能(或可取)?

我想这样做有两个原因:

重用:我可以在项目的多个地方使用不同的数据源使用相同的子类。 更简洁的代码:它会整理我的视图控制器。实现搜索的所有管道都将巧妙地封装在子类实现中。

任何想法将如何去做?

4

2 回答 2

0

利用UISearchDisplayController

来自苹果文档,

搜索显示控制器管理搜索栏和表视图的显示,该表视图显示由另一个视图控制器管理的数据的搜索结果。

您使用搜索栏和视图控制器初始化搜索显示控制器,该控制器负责管理要搜索的原始内容。当用户开始搜索时,搜索显示控制器负责将搜索界面叠加在原始视图控制器的视图上并显示搜索结果。结果显示在由搜索显示控制器创建的表格视图中。除了原来的视图控制器,逻辑上还有其他四个角色。这些通常都由同一个对象播放,通常是原始视图控制器本身。

它可以实现为,

searchController = [[UISearchDisplayController alloc]
                         initWithSearchBar:searchBar contentsController:self];
searchController.delegate = self;
searchController.searchResultsDataSource = self;
searchController.searchResultsDelegate = self;

UISearchDisplayController本身封装了所有正常的搜索功能。如果您愿意,可以将其子类化以实现您计划做的任何事情。您可以在任何课程中使用它。

于 2012-10-30T03:58:09.063 回答
0

我想我应该要求澄清一下:您是希望用户的搜索简单地滚动到表中的一行,还是希望它过滤行,只显示与搜索词匹配的行?

假设您希望它过滤行...

创建一个子类来执行此操作会非常复杂UITableView,因为您需要在“用户”数据源和委托之前插入您自己的私有数据源UITableViewDataSourceUITableViewDelegate委托。

它也可能相当低效,具体取决于您如何获取表格视图的数据。如果表视图可以有数千行,并且它们来自(例如)SQLite 数据库或 Core Data,则数据源可以更有效地搜索匹配行。在表格视图中,您别无选择,只能逐行迭代,检查每行是否匹配。或者您必须扩展数据源协议以为表格视图提供一种将搜索字符串传递给数据源的方法......这似乎违背了将搜索放在表格视图中的目标。

如果您告诉我们更多关于您的各种表格视图的数据来自何处,我们或许可以为您提供更好的建议。

于 2012-10-30T03:58:27.770 回答