我在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与核心数据交互(这样我就可以在网上查看)或者我应该做什么。
提前致谢
答案 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问题将变得更加平易近人。