我有一个应用程序将数据保存到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中使用它。
答案 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
设置。