请原谅我这是否已得到答复。我遇到的所有答案都使用相同的键对一组字典进行排序。不是这种情况。 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方法中合成和分配的。
答案 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(见上面的代码)。因此,如果您知道字典对象中数组中排序键的索引,则可以访问它,找到它(使用块)并将其用于排序。