0

我知道在 stackoverflow 中已经提出并回答了一大堆关于通过将这些键放入数组中的排序顺序来排序 NSDictionary 中的键的挑战。我知道对象在实际字典中不是按排序顺序存储的,也就是说,我认为是出于效率的原因,或者可能是 Foundation 代码的内存管理。

我一直在尝试从这里以及苹果文档和博客中的几个答案中尝试示例(有些我可以开始工作,有些则不行!),但我似乎找不到解决我困惑的示例。

我认为我的困惑是我在这里遇到的例子,在苹果文档和不同有用的博客中,似乎都有只有一个键值对而第二个值不是对象的例子——它更像只是一个值。(但它在某种程度上真的不是一个对象吗?我认为它是)

一个示例,我无法开始工作(通过 NSDictionary 值对 NSArray 进行排序),使用了这个想法

   [array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) {
    NSString *age1 = [item1 objectForKey:@"age"];
    NSString *age2 = [item2 objectForKey:@"age"];
    return [age1 compare:age2 options:NSNumericSearch];
    }];

我想也许这个想法,以更具体的方式指定密钥,可能是我的问题。

我想知道是否可能我没有与编译器通信密钥是什么,对象是什么,这就是为什么我收到“无法识别的选择器发送到实例”错误。

.....代码片段跟随......

1)我有一个名为“狗”的课程。一个给定的 dog 对象有几个属性,包括一个 NSString 键。

我的键是“licenseString”是一个字母数字键 - 我也想知道我是否应该使用 decimalNumberWithString 但这不是这里的问题

 @property (strong,nonatomic) NSString *licenseString;
  @property (strong, nonatomic) NSString *dogName;
 @property (strong, nonatomic) NSString *whatMakesDogSpecial;
 @property (strong, nonatomic) UIImage *dogPhoto;

2) 我有一个 NSDictionary @property (nonatomic, strong) NSDictionary *dogDictionary;

我以这种不太复杂的方式将信息硬编码到 dogDictionary 中,

 Dog *aDog;

// Dog one
aDog = [[Dog alloc]init] ;

aDog.licenseString     = @"1";
aDog.dogName   = @"Oscar";

aDog.whatMakesDogSpecial = @"This animal was found at the Mid-Penn humane society. He is super friendly, plays well with other dogs and likes people too. He enjoys fetching balls and frisbees too. He also goes to the park daily."   ;

aDog.dogPhoto   = [UIImage imageNamed:@"webVuMiniAppDogOscar.jpg"];

[self.dogDictionary setValue:aDog forKey:aDog.licenseString];

3)然后,一旦我的 dogDictionary 中有几个狗对象,我想对许可证标签值进行排序,以便我可以用狗名填充表格视图,但按它们的许可证标签的顺序排列。

顺便说一句,编译器似乎确实识别了下面代码片段中出现的“vars.dogDictionary”,因为当我查看调试器时,我可以看到我的狗字典中出现了两个有效实例。调试器输出在附件中

因此,使用来自 stackoverflow 答案和苹果文档的想法,我写了这个

 NSArray *sortedKeys = [vars.dogDictionary keysSortedByValueUsingComparator:
                       ^NSComparisonResult(id obj1, id obj2) {
                           return [obj1 compare:obj2];
                       }];


NSLog(@" The sorted array is %@", sortedKeys);

这就是我的问题发生的地方。我认识到 0x1182f740 指的是“obj1”,如调试器附件中所示

2013-08-06 15:13:58.276 SortDogLIcenseTags[3876:11303]-[Dog compare:]:无法识别的选择器发送到实例 0x1182f740 (lldb)

附件是显示调试器值的图片 - 他们不喜欢很好地粘贴

从调试器中 - 有效的狗对象显示为 obj1 和 obj2 具有我放入的属性

4

1 回答 1

0

以下是我解决这一挑战的方法。它可以工作并且非常简单地集成到我的主/细节项目中

我知道我在网上某个地方找到了一个教程,引导我找到了这个解决方案,很抱歉我现在找不到它。

请注意, sortedDogDictionaryArray 和 dogDictionaryArray 在 .h 文件中被声明为属性。

self.dogDictionaryArray = [vars.dogDictionary allValues];
// Sort

NSSortDescriptor *sortDescriptorDog =
[[NSSortDescriptor alloc] initWithKey:@"licenseString" ascending:YES];
NSArray *sortDescriptorsDogs =
[NSArray arrayWithObject:sortDescriptorDog];


self.sortedDogDictionaryArray =
[self.dogDictionaryArray sortedArrayUsingDescriptors:sortDescriptorsDogs];
NSLog(@"%@",self.sortedDogDictionaryArray );

int doggie;
Dog *someDogName;
NSLog(@"Sorted Order is...");

for (doggie = 0; doggie < [self.sortedDogDictionaryArray count]; doggie++) {


    //NSLog(@"%@", [sortedArray objectAtIndex:i]);
    //NSLog(@"%@", [sortedArrayDogs objectAtIndex:doggie]);
    someDogName = [self.sortedDogDictionaryArray   objectAtIndex:doggie];
    //NSLog(@"name is %@", someDogName.dogName);
    NSLog(@"name is %@ tag is %@", someDogName.dogName, someDogName.licenseString);


}
于 2013-08-11T01:21:56.123 回答