NSDictionary的allKeys阵列搞砸了 - 不是按照它们在字典中的顺序?

时间:2012-05-01 16:32:58

标签: iphone ios nsarray plist nsdictionary

在我的项目中,我从.plist中提取数据,更具体地说是从NSDictionary中提取数据。我使用.plist的内容初始化一个字典,效果很好。 然后当我做

NSArray *array = [dict allKeys];

它用所有键填充数组,但是以完全随机的顺序填充,与.plist文件中的顺序不同。我真的需要保留订单。 字典中的键是数组,如果这可能会导致问题。 我没得到什么?

提前多多感谢!

5 个答案:

答案 0 :(得分:7)

就像NSSet中的项目之间没有顺序一样,NSDictionary中的键值对没有固有的顺序。

如果您希望按特定顺序使用密钥,则需要使用- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr之类的内容,但这不会给出在plist文件中序列化NSDictionary的顺序。

答案 1 :(得分:6)

没有这样的内置方法可以从中获取此信息。但是一个简单的逻辑工作对你而言。在准备字典时,您只需在每个键前添加一些数字文本即可。像

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                       @"01.Created",@"cre",
                       @"02.Being Assigned",@"bea",
                       @"03.Rejected",@"rej",
                       @"04.Assigned",@"ass",
                       @"05.Scheduled",@"sch",
                       @"06.En Route",@"inr",
                       @"07.On Job Site",@"ojs",
                       @"08.In Progress",@"inp",
                       @"09.On Hold",@"onh",
                       @"10.Completed",@"com",
                       @"11.Closed",@"clo",
                       @"12.Cancelled", @"can",
                       nil]; 

现在,如果您可以使用sortingArrayUsingSelector,同时获得与您放置的顺序相同的所有键。

 NSArray *arr =  [[dict allKeys] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];

在你想要在UIView中显示键的地方,只需砍掉正面的3个字符。

答案 2 :(得分:3)

正如Qwerty Bob所说,NSDictionary没有订购其内容。如果您需要保留密钥的订单,一种方法是在.plist文件中单独存储密钥数组。然后,枚举数组并使用它来按顺序访问字典值。

答案 3 :(得分:2)

您可以按照所需的顺序使用词典键创建NSArray。

答案 4 :(得分:-1)

试试这个:

NSArray *array = [dict allKeys];

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors = [NSArray arrayWithObject:descriptor];

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors];