核心数据和UISearchBar之间的麻烦

时间:2013-10-18 20:06:04

标签: ios objective-c uitableview core-data

我在StackOverflow上看到了很多问题,但大多数都没有得到答复。 我创建了一个使用CoreData的应用程序。要访问数据,您必须单击正确的UITableView单元格,其中单元格名称(textLabel)来自Core Data属性,如

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    NSManagedObject *data = [self.datas objectAtIndex:indexPath.row];
    [cell.textLabel setText:[NSString stringWithFormat:@"%@", [data valueForKey:@"name"]]];
    [cell.detailTextLabel setText:nil];
}

之后,我遵循了很多关于如何添加UISearchBar的教程,但是应用程序总是崩溃,因为他无法将UISearchBar文本与用于单元格textLabel的Core Data中存储的信息相匹配(应该是滤波的)

对于过滤我使用网上找到的这个方法:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{ // searchDati = array where i'm supposed to store the filtered rows
  /* datas was created like this:
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"];
self.datas = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];  to manage the Core Data i suppose.*/

    [_searchDati removeAllObjects];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
    _searchDati = [NSMutableArray arrayWithArray:[_datas filteredArrayUsingPredicate:resultPredicate]];
}


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}
你能告诉我我该怎么办?如果提供代码很困难,你至少可以告诉我是否有一种简单的方法让UISearchBar与核心数据交互(这样我就可以在网上查看)或者我应该做什么。 提前致谢

1 个答案:

答案 0 :(得分:1)

让我们从您调用CoreData开始,然后一旦工作,您就可以继续查询它并从搜索栏进行响应。

由于UITableViewControllerDelegate协议方法需要非常快速的响应,标准做法是从数据库中获取所需的数据并将其存储在类变量中,然后使用tableview:cellForRowAtIndexPath:方法将类数据从类变量加载为需要的。

当您对数据进行更改时,您更新了类变量,并且可以在tableView上调用reloadData:以使接口赶上(视图不是模型...)

从配置正确的获取请求开始,并将响应加载到NSMutableArray类变量中。一个例子如下:

- (void)loadFiltersFromStore {
    _enabledFilters = nil;
    AppDelegate* delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext* moc = [delegate managedObjectContext];
    NSEntityDescription* description = [NSEntityDescription entityForName:@"Filter" inManagedObjectContext:moc];
    NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSFetchRequest* request = [[NSFetchRequest alloc] init];
    [request setEntity:description];
    [request setSortDescriptors:[NSArray arrayWithObject:descriptor]];
    NSError *error;
    _enabledFilters = [NSMutableArray arrayWithArray:[moc executeFetchRequest:request error:&error]];
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }
}

现在你有一些数据被提取并存在于一个类变量中(在这个例子中,该变量是一个名为“enabledFilters”的NSMutableArray,它包含一个名为“Filter”的NSManagedObject的多个实例)

现在,您可以像这样使用tableView的数据进行访问:

FreeCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"oneCell" forIndexPath:indexPath];
Filter* thisFilter = (Filter*)[_enabledFilters objectAtIndex:indexPath.row];
cell.label.text = thisFilter.name;
cell.label.backgroundColor = [UIColor clearColor];
NSString*targetName = thisFilter.imageName;
UIImage *image = [UIImage imageNamed:targetName];
cell.image.image = image;
BOOL purchased = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:k_upgradePurchased];
if ([thisFilter.paidOrFree isEqual: @"free"]) {
    cell.lockImage.hidden = YES;
}
else if (purchased) {
    cell.lockImage.hidden = YES;
}
else {
    cell.lockImage.hidden = NO;
}
return cell;

我故意设置此表视图,以便该行始终对应于_enabledFilters中对象的索引。你不必这样做,但这是很常见的做法。

现在,您可以使用简单的“点”访问器访问NSManagedObject的每个实例的属性。在该示例中,我将拉存储在三个不同属性(.name .imageName和.paidOrFree)中的值,并使用它们来配置特定单元格。

首先让您的基础CoreData正常工作,searchBar问题将变得更加平易近人。