Ios Can';t使用NSPredicate对我的表数据实施搜索筛选器
现在我的搜索工作是通过Ios Can';t使用NSPredicate对我的表数据实施搜索筛选器,ios,uitableview,search,filter,nspredicate,Ios,Uitableview,Search,Filter,Nspredicate,现在我的搜索工作是通过sectionsTitle,如果我写“Category1”或“Category2”,它会找到sectioncategory1或Category2,但我需要在所有这些部分中按名称搜索,从这里开始: NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; [NSString string
sectionsTitle
,如果我写“Category1”或“Category2”,它会找到sectioncategory1或Category2,但我需要在所有这些部分中按名称搜索,从这里开始:
NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
[NSString stringWithFormat:@"%@", [dict objectForKey:@"Name"]];
按姓名搜索时,我需要在代码中更改什么?现在我对所有的NSArray、NSMutableArray和NSDictionary都感到困惑:(
我按如下方式加载数据:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [[documentPaths lastObject] stringByAppendingPathComponent:@"data.plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
sectionKeys = [NSMutableArray new];
sectionsTitle = [NSMutableArray new];
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"blueKey"])
{
ann = [dict objectForKey:@"Category1"];
[resultArray addObject:@"Category1"];
[resultDic setValue:ann forKey:@"Category1"];
[sectionKeys addObject:@"Section 1"];
}
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"yellowKey"])
{
ann = [dict objectForKey:@"Category2"];
[resultArray addObject:@"Category2"];
[resultDic setValue:ann forKey:@"Category2"];
[sectionKeys addObject:@"Section 2"];
}
self.tableData = resultDic;
self.sectionsTitle = resultArray;
[myTable reloadData];
这就是我过滤数据的方式:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"SELF contains[cd] %@",
searchText];
searchResults = [sectionsTitle filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
我的桌子是这样的:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (tableView == self.searchDisplayController.searchResultsTableView) {
return 1;
}else{
return sectionKeys.count;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if (tableView == self.searchDisplayController.searchResultsTableView) {
return @"Search";
}else{
return [sectionKeys objectAtIndex:section];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.searchDisplayController.searchResultsTableView) {
return [searchResults count];
} else {
int num = [[tableData objectForKey:[sectionsTitle objectAtIndex:section]] count];
return num;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
if (tableView == self.searchDisplayController.searchResultsTableView) {
cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
} else {
NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont fontWithName:@"Avenir" size: 16.0];
cell.detailTextLabel.font = [UIFont fontWithName:@"Avenir" size: 12.0];
cell.textLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Name"]];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Address"]];
}
return cell;
}
我的数据结构:
使用简化的数据集(仅字典中包含的名称条目),这将重现您的设置:
NSArray *categories = @[
@[@{@"Name":@"Joe"}, @{@"Name":@"Jane"}],
@[@{@"Name":@"Anne"}, @{@"Name":@"Bob"}]
];
然后NSPredicate的任何运算符将找到您要查找的数组:
NSString *nameToSearch = @"Bob";
NSPredicate *catPred = [NSPredicate predicateWithFormat:@"ANY Name = %@", nameToSearch];
要查看此谓词如何筛选类别数组,请执行以下操作:
NSArray *filteredCats = [categories filteredArrayUsingPredicate:catPred];
顺便说一句,如果您构建一些自定义对象来保存数据,而不是仅依赖数组和字典,您可能会少一些困惑。我编辑了代码并添加了数据结构图像每个类别都有很多字典Item0、Item1等。抱歉,我不知道如何实现您对我的代码的回答