在我的项目中,我从 .plist 中提取数据,更具体地说是从 NSDictionary 中提取数据。我用 .plist 的内容初始化了一个字典,效果很好。当我这样做的时候
NSArray *array = [dict allKeys];
它用所有键填充数组,但顺序完全随机,与它们在 .plist 文件中的顺序不同。我真的需要保留订单。字典中的键是数组,如果这可能会导致问题。我没有得到什么?
提前非常感谢!
在我的项目中,我从 .plist 中提取数据,更具体地说是从 NSDictionary 中提取数据。我用 .plist 的内容初始化了一个字典,效果很好。当我这样做的时候
NSArray *array = [dict allKeys];
它用所有键填充数组,但顺序完全随机,与它们在 .plist 文件中的顺序不同。我真的需要保留订单。字典中的键是数组,如果这可能会导致问题。我没有得到什么?
提前非常感谢!
就像 NSSet 中的项目之间没有顺序一样,NSDictionary 中的键值对也没有内在的顺序。
如果您想要特定顺序下的键,则需要使用类似的东西,- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr
但这不会给出 NSDictionary 在 plist 文件中序列化的顺序。
没有这样的内置方法可以从中获取。但是一个简单的逻辑对你有用。准备字典时,您可以在每个键前简单地添加一些数字文本。像
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个字符剪掉即可。
正如 Qwerty Bob 所说,NSDictionary 不会对其内容进行排序。如果您需要保留密钥的顺序,一种方法是将密钥数组单独存储在 .plist 文件中。然后,枚举数组并使用它按顺序访问字典值。
您可以按照您想要的顺序使用 Dictionary 键创建一个 NSArray。
试试这个:
NSArray *array = [dict allKeys];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors = [NSArray arrayWithObject:descriptor];
NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors];