我有一个plist(一个字典数组),我正在读一个NSArray,我用来填充一个表。这是人员及其工作地点,电话号码等的列表。我添加了一个UISearchBar并实现了textDidChange方法。
当我按照这个人的姓氏搜索时,我确实看到了表格中的过滤列表,但是我认为我没有正确存储过滤后的结果。我正在使用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];
}
答案 0 :(得分:2)
保持简单,摆脱表委托方法中的标志和不同的数组。相反,您的源数据有一个数组(content
),另一个数组用于实际显示的源数据(称之为displayContent
)。
现在,当您启动时,请设置displayContent = content
。
然后,当您想要过滤时,设置displayContent = [content filteredArrayUsingPredicate:...];
(您可以将当前循环转换为简单谓词)。
最后,当您完成搜索后,请设置displayContent = content
。
没有旗帜。表委托方法中没有if
个。简单易读的代码。
P.S。你的问题是:
[filteredPeople addObject: [dict objectForKey:@"Last"]];
你应该设置为:
[filteredPeople addObject:dict];
所以你拥有所有数据而不仅仅是名字。虽然从技术上讲,您仍然可以通过在content
中搜索姓氏来使其发挥作用。