0

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

1 回答 1

2

保持简单,去掉表委托方法中的标志和不同的数组。相反,为您的源数据 ( content) 设置一个数组,为实际用于显示的源数据设置另一个数组 (调用它displayContent)。

现在,当你启动时,设置displayContent = content.

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

最后,完成搜索后,设置displayContent = content.

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

ps你的问题是:

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

您应该设置为:

[filteredPeople addObject:dict];

所以你有所有的数据,而不仅仅是名字。尽管从技术上讲,您仍然可以通过在content.

于 2013-10-07T20:12:02.440 回答