我需要在UITableView中显示API返回的NSDictionary的内容,并遵守键的顺序。
我正在使用:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *key = self.data.allKeys[indexPath.section];
NSArray *list = self.data[key];
id data = list[indexPath.row];
PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];
cell.model = data;
return cell;
}
但正如我self.data.allKeys
,我正在失去我的钥匙的顺序。我不能按价值对它们进行排序,因为它与它们无关。
答案 0 :(得分:24)
试试这个,
NSArray *keys = [myDictionary allKeys];
keys = [keys sortedArrayUsingComparator:^(id a, id b) {
return [a compare:b options:NSNumericSearch];
}];
NSLog(@"%@",keys);
现在根据已排序的密钥获取值。
修改强>
要按字母顺序对它们进行排序,请尝试使用
NSArray *keys = [myDictionary allKeys];
keys = [[keys mutableCopy] sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSLog(@"%@",keys);
答案 1 :(得分:1)
正如大家所说,我无法订购我的NSDictionary日志中出现的密钥,因为没有订购NSDictionary。
我要求API中的人返回一个数组:
0 => name : key 1
value : value 1
1 => name : key 2
value : value 2
/ ------------------------------------------- --------------------------------- /
太糟糕了,没有像这样使用的方法“sortedArrayUsingArray”:
NSArray * arrayOne = [@"key E", @"key A", @"key C"];
NSArray * arrayTwo = [@"key A", @"key B", @"key C", @"key D", @"key E", @"key F"];
NSArray * orderedArray = [arrayOne sortedArrayUsingArray: arrayTwo];
答案 2 :(得分:0)
我编写了一个快速方法来获取源数组(对象全部乱序)和一个引用数组(具有所需(和完全任意)顺序的对象),并返回一个数组所在的数组已重新组织源数组以匹配引用数组。
- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for (int i = 0; i < [referenceArray count]; i++)
{
if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
{
[returnArray addObject:[arrReference objectAtIndex:i]];
}
}
return [returnArray copy];
}
请注意,这非常脆弱。它使用NSArray
的{{1}}方法,最终将调用NSObject
's isEqual:
。基本上,它应该适用于containsObject:
s,NSString
s和NSNumber
s(尚未尝试过那个)的数组,但除此之外,YMMV。我想如果你试图传递NSDate
s或其他一些非常复杂的对象的数组,那么它本身就会完全失败,并且会崩溃或返回总垃圾。同样,如果您要执行诸如传递UITableViewCell
s数组作为参考数组和NSDate
s数组作为源数组。此外,如果源数组包含引用数组中未涵盖的项,则它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。
所有这一切,如果你想做一些简单的事情,它应该很好地工作。在您的情况下,您只需从您作为源数组发布的答案发送NSString
,并将arrayOne
作为参考数组发送。
答案 3 :(得分:0)
你说你丢失了按键的顺序,所以我想你从NSArray
中取出这些按键。对?在那个NSArray
中,你可以根据需要订购钥匙。而且我也看到NSDictionary
的对象是Arrays
,对吧?是。所以在你的Ordered Array
中你有更多阵列。
data
是NSDictionary的名称。
所以,你要做的就是将NSArray
(按照你一直想要的那个)带到这个.m文件中,然后在你的cellForRowAtIndexPath
方法中使用一些很棒的代码。您可以通过执行以下操作来完成此操作:
@interface yourViewController ()
{
NSArray *yourArrayOrdered;
}
@end
@implementation yourViewController
- (void)viewDidLoad
{
[super viewDidLoad];
yourArrayOrdered = [[NSArray alloc] initWith...:... ];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *key = yourArrayOrdered[indexPath.row];
NSArray *list = [self.data objectForKey:yourArrayOrdered[indexPath.row]];
//your code continues here...
/*id data = list[indexPath.row]; //don't think you need this line
PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];
cell.model = data; */
return cell;
}
这就是你需要做的就是使用NSDictionary和NSArray保持你想要的顺序。
为了更好地可视化,如果您的有序数组只包含字符串,它将是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *key = yourArrayOrdered[indexPath.row];
NSString *myString = [self.data objectForKey:yourArrayOrdered[indexPath.row]];
cell.textLabel.text = [NSString stringWithFormat:@"THIS IS THE OBJECT %@", myString];
cell.detailTextLabel.text = [NSString stringWithFormat:@"AND THIS IS THE KEY %@", key];
return cell;
}
希望它有所帮助。