【问题标题】:Adding a Search Bar to a Table View with Core Data使用 Core Data 将搜索栏添加到表视图
【发布时间】:2014-08-05 19:16:27
【问题描述】:

我有一个将数据保存到 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 中使用它。

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

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

    - (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 是显示图片的控制器。

    【讨论】:

    • 谢谢,但我将如何在 prepareForSegue 中使用它?使用 NSArray 只会显示单元格 textLabels 但如何访问对象本身,所以当我单击搜索到的单元格时,它会转到其图片视图?
    • 我在我的回答中添加了prepareForSegue 的样子。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多