NSDictionary搜索问题

时间:2013-10-07 20:05:17

标签: ios xcode

我有一个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];
}

1 个答案:

答案 0 :(得分:2)

保持简单,摆脱表委托方法中的标志和不同的数组。相反,您的源数据有一个数组(content),另一个数组用于实际显示的源数据(称之为displayContent)。

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

然后,当您想要过滤时,设置displayContent = [content filteredArrayUsingPredicate:...];(您可以将当前循环转换为简单谓词)。

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

没有旗帜。表委托方法中没有if个。简单易读的代码。

P.S。你的问题是:

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

你应该设置为:

[filteredPeople addObject:dict];

所以你拥有所有数据而不仅仅是名字。虽然从技术上讲,您仍然可以通过在content中搜索姓氏来使其发挥作用。