使用核心数据将搜索栏添加到表视图

时间:2014-08-05 08:42:20

标签: ios core-data

我有一个应用程序将数据保存到Core Data sql,然后在表格视图中查看。

数据模型:

Entity: Fruits

Attributes:  name, picture

所以在表格视图中, cell.textLabel.text = Fruits.name

每个单元格都有一个segue,其中的视图显示 Fruits.picture

我想添加一个搜索栏来搜索水果名称。

我遵循了本教程:http://www.appcoda.com/search-bar-tutorial-ios7/

但我遇到的问题是 filterContentForSearchText

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

我使用的是核心数据,而不是用于存储数据的数组。而且我不知道如何过滤它以便我可以在表格单元格中显示searchResults并在prepareForSegue中使用它。

2 个答案:

答案 0 :(得分:5)

由于您使用核心数据而不是水果数组,因此您应该以这种方式过滤数据:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Fruits" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    [fetchRequest setPredicate:predicate];

    NSError *error;

    NSArray* searchResults = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
}

要在第二个viewController中显示图片,您应该在 prepareForSegue 方法中添加类似的内容:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    Fruit *selectedItem;
    if (self.searchDisplayController.active) {
        selectedItem = [searchResults objectAtIndex:indexPath.row];
    } else {
        selectedItem = [fruitsList objectAtIndex:indexPath.row];
    }
    DestinationViewController *destination = segue.destinationViewController;
    destination.fruit = selectedItem;
}

其中fruitsList是一个包含所有水果对象的数组(用于显示没有任何过滤器的水果的对象),DestinationViewController是将显示图片的控制器。

答案 1 :(得分:2)

首先,为什么您的实体名称是复数?这令人困惑。您应该重命名实体Fruit

其次,为什么变量名以大写字母开头?这再次令人困惑,因为他们可能被误认为是类名。您应该重命名变量fruit,例如fruit.name

第三,您应该使用NSFetchedResultsController填充表格视图。您可以在内存中单独搜索或过滤单独的一个。两者都优于在每次调用filterContentForSearchText时进行手动提取。您的过滤器代码看起来很好(它是内存中的版本)。但是,我没有看到您重新加载搜索结果表视图的数据。

第四,搜索与segue问题完全无关。每个单元格应与特定的Fruit实例相关联。 (@property类型为Fruit的自定义单元格,或使用获取的结果控制器objectAtIndexPath。)在prepareForSegue中,您只需将该水果分配给详细视图控制器(应该有适当的@property设置。