1

希望有人可以帮助我:

我正在使用 aNSDictionary来填充UITableView. 它的模型是这样的[key:userID => value:userName]。tableView 只填充了用户名,但是当点击时,它必须发送相关的用户 ID。当我想过滤UITable. 我只找到了通过将字典转换为NSArray(使用谓词)来过滤字典的方法,但这让我失去了用户名和用户 ID 之间的关系。

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

我该怎么做,或者有更好的解决方案吗?

4

4 回答 4

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

然后,当您想要在用户选择单元格时传递用户 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 数据源和委托方法。

于 2013-04-28T10:38:20.843 回答
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];
   }
}
于 2013-04-28T10:45:24.087 回答
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

于 2013-04-28T10:47:18.140 回答
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 过滤
于 2013-04-28T11:10:15.640 回答