基于字典唯一键对NSDictionaries数组进行排序

时间:2012-09-22 15:43:22

标签: objective-c uitableview sorting nsarray nsdictionary

请原谅我这是否已得到答复。我遇到的所有答案都使用相同的键对一组字典进行排序。不是这种情况。 UIView,使用UITableView(已分组)具有tblData和部分。 tblData从对象数组中获取其数据。 我可以使用比较器对数组进行排序,但无论我尝试过什么,都不会反映出变化。 这是创建数据的方法:

   if (myAppointment!=nil){
        if (myAppointment.OBSERVATIONS!=nil){
            [self.tblData removeAllObjects];
            @synchronized(self.myAppointment){
                for (Observations *tmpObs in [self.myAppointment OBSERVATIONS]){
                    NSMutableString *tmpHdr = [[NSMutableString alloc] initWithString:@"Observation made on: "];
                    [tmpHdr appendString:tmpObs.TIME];
                    [self.tblData setObject:[[NSArray alloc] initWithObjects:tmpObs.TYPE, tmpObs.NOTE, nil] forKey:tmpHdr];
                }
            }
        }
        self.sections = [[self.tblData allKeys] sortedArrayUsingSelector:@selector(compare:)];
    }
    [self.GroupTblView reloadData];

当我尝试对myAppointment.OBSERVATIONS进行排序时,我可以验证它们是否已排序。然而,当我尝试重新加载希望它已被排序的数据时,不会发生任何变化:

        [self.tblData removeAllObjects];
        [self.myAppointment.OBSERVATIONS sortUsingSelector:@selector(compareByType:)];                
        for (Observations *tmpObs in self.myAppointment.OBSERVATIONS){   
            NSMutableString *tmpHdr = [[NSMutableString alloc] initWithString:@"Observation made on: "];
            [tmpHdr appendString:tmpObs.TIME];
            [self.tblData setObject:[[NSArray alloc] initWithObjects:tmpObs.TYPE, tmpObs.NOTE, nil] forKey:tmpHdr];
        }
        self.sections = [[NSArray alloc] initWithArray:[self.tblData allKeys]];
        [self.GroupTblView reloadData];

据我了解,各部分未进行排序或未更新。 从上面可以看出,字典键随着每个“观察”而变化,因此通过使用NSSortDescriptor,它不像通常那样简单地排序。 有没有办法绕过这个,比如说,使用一个块+ sortedArrayUsingComparator?

编辑:

@property (strong, nonatomic) IBOutlet UITableView *GroupTblView;
@property (nonatomic, strong) NSMutableDictionary *tblData;
@property (nonatomic, strong) NSArray *sections;

它们都是在initWithNib方法中合成和分配的。

1 个答案:

答案 0 :(得分:0)

这个例子有点傻,我把我的问题归结为长时间的工作。如果有人有兴趣在分组模式下对UITableView使用的tableData进行排序,那么我就是这样做的:

        self.sections = [[self.tblData allKeys] 
                         sortedArrayUsingComparator: ^(id a, id b){
                                        // a is a section (a key from the Dictionary), b is another section (another key)
                                        NSArray *a_arr = [self.tblData objectForKey:a];
                                        NSArray *b_arr = [self.tblData objectForKey:b];
                                        // We know that the first item in the array is always the type
                                        return [[a_arr objectAtIndex:0] compare:[b_arr objectAtIndex:0]];
                                        }];
        [self.GroupTblView reloadData];

请记住,objectAtIndex:0是我的观察.TYPE(见上面的代码)。因此,如果您知道字典对象中数组中排序键的索引,则可以访问它,找到它(使用块)并将其用于排序。