2013-10-07 116 views
0

我有一个plist(一个字典数组的数组),正在读入一个NSArray,我正在使用它来填充一个表。这是一个人员列表,他们的工作地点,电话号码等。我添加了一个UISearchBar,并实现了textDidChange方法。NSDictionary搜索问题

当我按照人的姓氏搜索时,我在表格中看到过滤列表,但我认为我没有正确存储过滤结果。我正在使用一个NSMutable数组,但我失去了关键:值的配对。

有人可以请指出我在正确的方向吗?我最终想点击一个过滤的名称并推送到详细的视图控制器。我相信我的问题是我试图捕获NSMutableArray中的筛选结果,但我不确定。

我已经做了很多谷歌搜索,但似乎无法把它放在我的脑海。任何帮助表示赞赏。

此致 达林

这里是我使用加载的plist阵列。

-(NSArray *)content 
{ 
    if (!content){ { 
     content = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ophonebook" ofType:@"plist"]]; 
    NSSortDescriptor* nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Last" ascending:YES]; 
    content= [content sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameSortDescriptor]]; 
} 
return content; 
} 

这里是方法的UISearchBar

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
if (searchText.length == 0) 
{ 
    isFiltered= NO;   
} else { 
    isFiltered= YES; 
    filteredPeople = [[NSMutableArray alloc]init]; 

    for (NSDictionary *dict in content) 
    { 
     NSString *last = [dict objectForKey:@"Last"]; 
     NSRange lastRange = [last rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     if (lastRange.location != NSNotFound) 
     { 
     [filteredPeople addObject: [dict objectForKey:@"Last"]]; 
     } 
    } 
} 
[myTableView reloadData]; 
} 

回答

2

让事情简单一些,在你的表委托方法摆脱标志和不同的阵列。相反,为您的源数据(content)和另一个实际用于显示的源数据(称为displayContent)有一个数组。

现在,当您启动时,请设置displayContent = content

然后,当你想过滤,设置displayContent = [content filteredArrayUsingPredicate:...];(你可以将你的当前循环转换成一个简单的谓词)。

最后,当您完成搜索时,请设置displayContent = content

没有标志。表中没有if s委托方法。简单易读的代码。

p.s.你的问题是:

[filteredPeople addObject: [dict objectForKey:@"Last"]]; 

,你应该设置为:

[filteredPeople addObject:dict]; 

让你拥有所有的数据,而不只是名字。虽然在技术上你仍然可以通过搜索content中的姓氏来工作。

+0

谢谢!它正在工作。我一直在这个问题上主演,并没有看到它。按照您的建议,现在转回去清理。 – Darin