也许这是一个愚蠢的问题,但我觉得我可以改进我的项目或者至少让它更具可读性。
这是交易。我有一个UITableView
填充了来自服务器的数据。对于我使用MagicalRecord
的所有内容以及处理UITableView
,我使用NSFetchedResultController
。到目前为止一切都很好。当我尝试实现UISearchDisplayController
时会出现问题。使用NSFetchedResultController
时,我只是从核心数据中获取数据并将其传递给NSArray
。这是我用于排序的方法:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@", searchText];
searchResults = [Group MR_findAllSortedBy:@"caseInsensitiveName" ascending:YES withPredicate:resultPredicate];
}
当然,所有UITableView
样板代码都填充了if
条件检查UITableView
的类型。
我想我可以使用一个NSFetchedResultController
来处理这两个任务(populatind UITableView
')并省略这个searchResult
数组但我不确定......所以我将不胜感激任何建议,暗示或其他什么。
当我启用UITableViews
时,当我同时使用其他来源填充的sections
时,会遇到另一个问题。简而言之,UISearchDisplayController.tableView
涵盖了来自父section
的{{1}}。
以下是一些用于处理搜索和填充UITableView
UITableView
答案 0 :(得分:1)
我通常不会发现UISearchDisplayController
非常有用。这是因为:
因此,我通常只有一个表视图的数据源,并根据并输入搜索条件来操作该源。
这适用于FRC或简单数组。对于FRC,编辑获取请求(谓词)和performFetch:
,其他一切都是自动的。对于Array,使用sortedArrayUsingDescriptors:
并重新加载(我有源数据的原始数组,以及用于表方法的另一个数组引用。第二个数组指向原始数组实例或从中创建的新实例排序)。
在这两种情况下,我使用UISearchDisplayController
的方法数量都相似,但表方法中没有if
个语句。任何if
语句和数据源的变异,仅在搜索方法中处理(调用频率低得多)。
向班级添加属性:
@property (strong, nonatomic) NSPredicate *filterPredicate;
在搜索文本中更改了委托:
if (text.length > 0) {
self.filterPredicate = [NSPredicate predicateWithFormat:...];
} else {
self.filterPredicate = nil;
}
[self refreshFRC];
在搜索取消中,只需对谓词进行nil并刷新。
刷新:
- (void)refreshFRC {
NSFetchRequest *fetch = ...;
if (self.filterPredicate != nil) {
fetch.predicate = self.filterPredicate;
}
self.frc.fetchRequest = fetch;
[self.frc performFetch:...];
}