1

希望有人能帮助我与获取一个NSDictionary:通过过滤另一个NSDictionary的

我使用的是NSDictionary填充UITableView。 它的模型就像[key:userID => value:userName]。 tableView只填充了userName,但点击后,它必须发送相关的userID。 问题出现在我想过滤UITable时。我只找到了通过将它转换为NSArray(使用谓词)来过滤字典的方法,但它使我松散了userNames和userID之间的关系。

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

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

回答

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]]; 

然后,当哟U将要传递的用户ID,当用户选择该小区,在你tableView: didSelectRowAtIndexPath:你只是做这样说:

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

然后,当你要根据搜索的阵列来筛选,你可以简单地重新创建arrayForTableView,通过“扫描”你的NSDictionary这样:

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数据源和委托方法。

+0

好的,我明白了你的观点。我从错误的方面解决了问题,并且我被相同价值观的非问题所打扰。谢谢你的帮助。 – 2013-04-28 10:55:04

+0

我很高兴我的帮助。如果它解决了你的问题,也请投票:) – 2013-04-28 10:57:43

+0

还没有足够的声望做到这一点,但我会:) – 2013-04-28 11:06:21

0

你可以做下面以获取选定的密钥(用户名)值(用户ID):

//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]; 
    } 
} 
0

你使用一个NSDictionary来填充的UITableView这UITableView的只是充满了你的用户名通过做

[dictionary [email protected]"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

+0

我同意这两个allKey和allValues是并行,但是当我在allValues(userName)数组上使用谓词时,我有一个过滤的名称数组,但没有更多相关的ID。现在我解决了我的问题,但自定义班也是一个好主意。我可能会牢记以备后用;) – 2013-04-28 11:09:37

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过滤的支持