1

我已将搜索功能集成到我的应用程序中以查询核心数据/.sqlite,它工作正常。但是我有一个问题,我不确定我应该看哪个类配置,有人可以指点我吗,谢谢

基本上我的模型是这样的

TableView 1
显示产品类别
selectRow --> TableView2

TableView 2
显示所选类别的产品
selectRow --> TableView3

当我在TableView 1中集成 UISearchBar 时,我希望在人们搜索他们想要的产品时拥有该功能,它会立即在表格视图中显示产品的名称。我试过了,但结果显示包含“搜索到的产品” 的类别。

那么,我怎样才能让它正确显示以及我应该查看哪个配置部分?

    UISearchDisplayController *searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];  

[self performSelector:@selector(setSearchDisplayController:) withObject:searchDisplayController];

[searchDisplayController setDelegate:self];  
[searchDisplayController setSearchResultsDataSource:self];  
[searchDisplayController setSearchResultsDelegate:self];
[searchDisplayController release];  
[self.tableView setContentOffset:CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height)];

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();

    self.filteredListContent = [NSMutableArray arrayWithCapacity:[[[self fetchedResultsController] fetchedObjects] count]];
}   

是这部分代码吗?
谢谢

更新更多信息:

配置单元

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *entity = nil;
if (self.searchIsActive){  // Configure the cell to show the searched item's name  
entity = [[self filteredListContent] objectAtIndex:[indexPath row]];
cell.textLabel.textColor = [UIColor blackColor];
} else {// Configure the cell to show the category's name 
cell.textLabel.textColor = [UIColor blackColor];  
entity = [fetchedResultsController objectAtIndexPath:indexPath]; 
} 
cell.textLabel.text = [entity valueForKey:@"nameEN"]; 
}  

搜索谓词

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"ANY products.nameEN CONTAINS[cd] %@", searchText];
self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];
}

核心数据结构

Category{  
    nameEN  
    products <- one to many relation ->> Product.productcat
}

Product{ 
    nameEN  
    spec  
    productcat <<-- many to one relation-> Category.products
}

谢谢你。

4

2 回答 2

1

如果您的数据模型有一个Product实体和一个Category实体,并且您的提取返回的是Category对象而不是Product对象,那么您为提取设置了错误的实体。

[忽略以下,因为它适用于不同类型的搜索——techzen] 您通常为搜索创建单独的提取,因为每次用户在搜索中输入新字符时,提取的谓词都必须更改。

更新:

好的,我误解了您正在实施的搜索类型。您正在过滤现有提取的返回,而不是根据输入的搜索进行提取。

查看更新中的谓词和数据模型,我认为很明显谓词仅适用于Category对象数组。这:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"ANY products.nameEN CONTAINS[cd] %@", searchText];

... 只能过滤Category对象,因为只有Category对象具有products. 这个谓词说,“匹配所有相关产品对象具有包含搜索文本的 nameEn 属性值的所有类别对象。”

还要记住您在此处过滤的数组:

self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];

...是一个对象数组,Category而不是Product对象。

我认为你需要重新考虑你的 UI 设计。您的 TableView1 默认显示Category对象列表,但您希望搜索该表以显示Product对象列表。这会让用户感到困惑。用户将期望在Category对象表上进行搜索以返回Category对象子集。

但是,使用现有设计,您可以通过应用集合运算符Product创建一个新的对象数组,使用当前代码生成一个对象数组:Product@distinctUnionOfObjects

self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];
    NSArray *distinctProducts=[self.filteredListContent valueForKey:@"products.@distinctUnionOfObjects.enName"];

...现在将是匹配搜索条件distinctProducts的对象数组。Product使用该数组configureCell:atIndexPath(您可能需要使用它。)

于 2011-03-08T23:10:04.817 回答
0

所以,我在配置单元部分尝试了这些

        NSDictionary *distinctProducts=[self.filteredListContent valueForKey:@"products"];
    NSLog(@"what are products:%@",distinctProducts);
    NSArray *listofProductsName = [distinctProducts valueForKey:@"nameEN"];
    NSLog(@"whatup: %@",listofProductsName);
    NSArray *entity = [listofProductsName objectAtIndex:indexPath.row];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.text = entity;  

但后来我可以将名称转换为显示...它说 _NFSet isEqualToString: ....etc 终止了 NSException.. 虽然 listofProductsName 的 NSLog 显示了正确的产品名称列表。

于 2011-03-09T18:30:21.910 回答