通过过滤另一个NSDictionary来获取NSDictionary

时间:2013-04-28 10:30:32

标签: ios objective-c nsdictionary nspredicate uisearchdisplaycontroller

希望有人可以帮助我:

我正在使用NSDictionary来填充UITableView。 它的模型类似于[key:userID => value:userName]。 tableView仅填充userName,但单击时,必须发送相关的userID。 当我想要过滤UITable时会出现问题。我只找到了通过将字典转换为NSArray(使用谓词)来过滤字典的方法,但它让我放松了userNames和userID之间的关系。

解决方案是过滤初始NSDictionary以获得过滤的NSDictionary(仍具有关系键/值),但我不知道该怎么做。我只找到了获得阵列的解决方案。

我怎么能这样做,还是有更好的解决方案呢?

4 个答案:

答案 0 :(得分:1)

有一个更好的解决方案,弗朗索瓦。 从您的NSDictionary创建(我将在此处myDictionary),这样NSArray(在您的界面文件中声明):

NSArray *arrayForTableView;

然后,在加载NSDictionary之后,执行以下操作:

arrayForTableView = [myDictionary allKeys]; // so you will have an array of all UserID's

现在,在您的tableView: cellForRowAtIndexPath:方法中,您可以这样做:

cell.textLabel.text = [myDictionary objectForKey:[arraForTableView objectAtIndex:indexPath.row]];

然后,当您想要在用户选择单元格时传递userID时,在tableView: didSelectRowAtIndexPath:中,您只需这样做:

id userIDSelected = [arraForTableView objectAtIndex:indexPath.row];

然后,当你想根据搜索过滤数组时,你可以通过这种方式“扫描”你的NSDictionary来简单地重建你的arrayForTableView

NSString *typedString;
NSMutableArray *arrayFiltered = [NSMutableArray array];
for (int i = 0; i < [[myDictionary allKeys] count]; i++)
{
    if ([[myDictionary objectForKey:[[myDictionary allKeys] objectAtIndex:i]] rangeOfString:typedString].location != NSNotFound)
    {
        [arrayFiltered addObject:[[myDictionary allKeys] objectAtIndex:i]];
    }
}

arrayForTableView = arrayFiltered;

这样,您甚至不需要更改UITableView数据源和委托方法。

答案 1 :(得分:0)

您可以执行以下操作来获取所选密钥(userName)的值(userID):

//iterate through whole dictionary
for(id key in yourNSDictionary)
{
   // if key is the userName clicked
   if([key isEqualToString:selectedUserName])
   {
       //userID for clicked userName
       int userID = [yourNSDictionary objectForKey:@selectedUserName];
   }
}

答案 2 :(得分:0)

你正在使用NSDictionary来填充UITableView,而这个UITableView只填充了你用来做的用户名

[dictionary objectForKey@"userID"];

NSDictionary有两个函数allkeys和allValues

NSArray* allUserID = [dictionary allKeys];
NSArray* allUserNames = [dictionary allValues];

这是一个并行数组,因此一个数组的索引与其关联的数组并行运行。

表格单元格的每个单元格也可以是一个自定义类,它包含对自己的id和用户名的引用,这将允许您只传递单元格并拥有它的数据。

您可以在NSDictionary文档中了解这些功能

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html

答案 3 :(得分:0)

我建议使用NSDictionary值创建NSArray或NSMutableArray - UITableViews应由数组驱动,其中数组索引与行号匹配。然后,您可以轻松地为字典数组创建自定义过滤器,并考虑您的数据结构。您的代码可能包含此示例代码的一部分:

NSString *idKey = @"userId";
NSString *nameKey = @"userName";
NSArray *arr = @[
        @{
                idKey : @(24),
                nameKey : @"Oil Can Henry"
        },
        @{
                idKey : @(32),
                nameKey : @"Doctor Eggman"
        },
        @{
                idKey : @(523),
                nameKey : @"Sparticus"
        },
];
NSString *searchTerm = @"Spar";
NSArray *newArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject[nameKey] hasPrefix:searchTerm];
}]];

优点:

  • 表示所有数据的单一数据结构
  • 固有的,确定性的排序
  • 支持NSPredicate过滤