Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据与UISearchBar之间的问题_Ios_Objective C_Uitableview_Core Data - Fatal编程技术网

Ios 核心数据与UISearchBar之间的问题

Ios 核心数据与UISearchBar之间的问题,ios,objective-c,uitableview,core-data,Ios,Objective C,Uitableview,Core Data,我在这里看到了很多关于StackOverflow的问题,但大多数问题都没有答案。 我创建了一个使用CoreData的应用程序。要访问数据,您必须单击适当的UITableView单元格,其中单元格名称(textLabel)来自这样的核心数据属性 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *Ce

我在这里看到了很多关于StackOverflow的问题,但大多数问题都没有答案。 我创建了一个使用CoreData的应用程序。要访问数据,您必须单击适当的UITableView单元格,其中单元格名称(textLabel)来自这样的核心数据属性

- (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(应该进行筛选)

对于过滤,我使用了在网上找到的方法:

- (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与核心数据交互(以便我在网上查看),或者我应该做什么。
提前感谢

让我们从调用CoreData开始,然后在调用成功后,您可以继续查询它并从搜索栏中做出响应

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

对数据进行更改时,更新类变量,并可以在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;
我特意设置了这个表视图,以便行始终与启用过滤器中对象的索引相对应。你不必这么做,但这是很常见的做法

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

首先让您的底层CoreData正常工作,搜索栏问题将变得更加容易处理

可能重复感谢您的快速回答!:)代码数据工作得很好,只是我想添加一个UISearchBar以更快/更简单的方式访问存储的信息。无论如何,我试图将名称存储在一个数组中,但在“prepareforsgue”中遇到了问题,但可能我把代码弄糟了,因为我混合了许多教程来尝试解决这个问题!我马上试试你的代码。再次感谢您的回答和清晰的解释!