一个用于UITableview和UISearchDisplayController的NSFetchedResultController

时间:2014-01-07 12:09:53

标签: ios uitableview nsfetchedresultscontroller uisearchdisplaycontroller magicalrecord

也许这是一个愚蠢的问题,但我觉得我可以改进我的项目或者至少让它更具可读性。

这是交易。我有一个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

1 个答案:

答案 0 :(得分:1)

我通常不会发现UISearchDisplayController非常有用。这是因为:

  1. 我已经有了一个表格视图
  2. 在搜索和正常
  3. 时,表格视图单元格的显示应该相同
  4. 我仍然需要提供所有表委托和数据源方法
  5. 我仍然需要提供搜索委托方法
  6. 因此,我通常只有一个表视图的数据源,并根据并输入搜索条件来操作该源。

    这适用于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:...];
    }