在我的项目中,我从.plist中提取数据,更具体地说是从NSDictionary中提取数据。我使用.plist的内容初始化一个字典,效果很好。 然后当我做
NSArray *array = [dict allKeys];
它用所有键填充数组,但是以完全随机的顺序填充,与.plist文件中的顺序不同。我真的需要保留订单。 字典中的键是数组,如果这可能会导致问题。 我没得到什么?
提前多多感谢!
答案 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];