希望有人可以帮助我:
我正在使用NSDictionary
来填充UITableView
。
它的模型类似于[key:userID => value:userName]
。
tableView仅填充userName,但单击时,必须发送相关的userID。
当我想要过滤UITable
时会出现问题。我只找到了通过将字典转换为NSArray
(使用谓词)来过滤字典的方法,但它让我放松了userNames和userID之间的关系。
解决方案是过滤初始NSDictionary
以获得过滤的NSDictionary
(仍具有关系键/值),但我不知道该怎么做。我只找到了获得阵列的解决方案。
我怎么能这样做,还是有更好的解决方案呢?
答案 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文档中了解这些功能
答案 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];
}]];
优点: