好的,经过长时间的搜索,犹豫和更多的搜索,我似乎无法弄清楚这一点。
我有一个SearchDisplayController,我有四个不同的数组,我在使用NSPredicate搜索,因为每个UITableViewCell由4个字符串(标题,描述等)组成。
我现在有4个搜索数组,search_title,search_description等,这些填充如下:
- (void)filterContentForSearchText:(NSString*)searchText
scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"SELF contains[cd] %@",
searchText];
self.search_category = [self.temp_category filteredArrayUsingPredicate:resultPredicate];
self.search_producttitle = [self.price_producttitle filteredArrayUsingPredicate:resultPredicate];
self.search_type = [self.price_type filteredArrayUsingPredicate:resultPredicate];
self.search_description = [self.price_description filteredArrayUsingPredicate:resultPredicate];
当我使用NSLog(数组计数)时,我可以看到它正常工作,因为它在我输入搜索词时给出了每个数组的正确计数。
我的tableview单元格如下:
if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.nameLabel.text = [self.search_producttitle objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
cell.priceLabel.text = [self.search_price objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
cell.descrLabel.text = [self.search_description objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
cell.IDLabel.text = [self.search_type objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
}
else{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.nameLabel.text = [price_producttitle objectAtIndex:indexPath.row];
cell.IDLabel.text = [price_type objectAtIndex:indexPath.row];
cell.priceLabel.text = [price objectAtIndex:indexPath.row];
cell.descrLabel.text = [price_description objectAtIndex:indexPath.row];
也许你已经可以看到我正在尝试做的事情。我现在正在从旧数组中创建新数组,我称之为搜索数组。但是,这些阵列彼此独立(一个阵列可能是空的,而另一个阵列充满了研究结果)。我需要知道数据来自哪个索引,存储在那些searcharray中。如果我知道search_producttitle中的数据来自price_producttitle(原始数组)的索引1,3和4,那么我可以使用indexPath.row的这些数字来显示。至少,这是我现在的计划,制作一个searchResult数组,其中包含在制作单元格时应该在objectAtIndex中使用的数字。
我正在努力解决这个问题,我找不到他们在多个阵列中搜索的任何示例,因为这些单元格由多个数组组成。
有人可以给我一个好方向的提示,或者我可以使用的例子吗?
提前谢谢。
Prastow
我使用过的参考资料:
答案 0 :(得分:1)
虽然没有人回答我的问题,但我自己也明白了。
实际上,我觉得太难了。我想使用NSPredicate,这在我的案例中是不必要的。我想首先从NSPredicate获得一个字符串,然后比较字符串。我现在使用rangeofstring,在每个objectatindex的循环中,我为每个数组执行此操作。
如果在数组中找到它,则报告YES,索引将放在不同的数组中。稍后在制作UITableView时使用此数组,替换indexPath.row。
[self.searchResults removeAllObjects];
for (int i = 0; i < [temp_category count]; i++) {
BOOL foundResult = FALSE;
if ([[temp_category objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
foundResult = TRUE;
}
if ([[price_producttitle objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
foundResult = TRUE;
}
if ([[price_type objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
foundResult = TRUE;
}
if ([[price_description objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
foundResult = TRUE;
}
if (foundResult) {
NSNumber *result = [NSNumber numberWithInt:i];
if ([self searchResults] == nil) {
NSMutableArray *array = [[NSMutableArray alloc] init];
[self setSearchResults:array];
[array release];
}
[searchResults addObject:result];
}
}
NSLog (@"array = %i", [searchResults count]);
NSLog(@"%@",searchResults);
我不接受这个答案的学分。积分应转到:SearchDisplayController search multiple arrays
我采用了这种方法并在 - (void)searchtableview中实现了它。我应该提一下,对此没有太多问题,这是我能找到的唯一合适的答案。
我希望其他人也会觉得这很有用!!
答案 1 :(得分:0)
-(void)searchBar:(UISearchBar *)searchBar1 textDidChange:(NSString *)searchText
{
if ([searchText length]==0)
{
temp_array1 =[array_Main1 mutableCopy];
temp_array2 =[array_Main2 mutableCopy];
temp_array3 =[array_Main3 mutableCopy];
}
else
{
[temp_array1 removeAllObjects];
[temp_array2 removeAllObjects];
[temp_array3 removeAllObjects];
int g = 0;
for (int i=0; i< array_Main1.count;i++)
{
NSRange Range1 = [[array_Main1 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
NSRange Range2 = [[array_Main2 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
NSRange Range3 = [[array_Main3 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (Range1.location != NSNotFound || Range2.location != NSNotFound || Range3.location != NSNotFound )
{
[temp_array1 addObject:[array_Main1 objectAtIndex:g]];
[temp_array2 addObject:[array_Main2 objectAtIndex:g]];
[temp_array3 addObject:[array_Main3 objectAtIndex:g]];
}
g++;
}
}
[table reloadData];
}