5

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

NSArray *array = [dict allKeys];

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

提前非常感谢!

4

5 回答 5

7

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

如果您想要特定顺序下的键,则需要使用类似的东西,- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr但这不会给出 NSDictionary 在 plist 文件中序列化的顺序。

于 2012-05-01T16:36:02.043 回答
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中要显示key的地方,把前面的3个字符剪掉即可。

于 2013-02-22T09:10:34.330 回答
3

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

于 2012-05-01T16:41:40.433 回答
2

您可以按照您想要的顺序使用 Dictionary 键创建一个 NSArray。

于 2012-06-19T15:38:13.407 回答
-1

试试这个:

NSArray *array = [dict allKeys];

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

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors];
于 2014-12-19T01:33:47.013 回答