我正在尝试对填充了自定义对象的NSArray进行排序。每个对象都有一个NSDate类型的属性startDateTime
。
以下代码导致数组sortedEventArray
已填充但未排序。我是以完全错误的方式解决这个问题,还是我错过了一些小事?
NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors];
答案 0 :(得分:25)
您确定节点事件的startDateTime
个实例变量是非零吗?
如果您还没有,可以在节点事件对象中添加(自定义)-description
方法,执行以下操作:
- (NSString *)description {
return [NSString stringWithFormat:@"%@ - %@",
[super description], startDateTime]];
}
然后在您的排序代码中记录之前和之后的数组:
NSLog(@"nodeEventArray == %@", nodeEventArray);
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"startDateTime"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray
sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"sortedEventArray == %@", sortedEventArray);
如果startDateTime
都是nil
,那么前后阵列将具有相同的顺序(因为排序操作等同于将所有-compare:
消息发送到{ {1}},基本上什么都不做。)
答案 1 :(得分:11)
您是否尝试过指定NSDate
比较器?
例如:
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"startDateTime"
ascending:YES
selector:@selector(compare:)];
这应该强制使用NSDate
类的正确比较器。
答案 2 :(得分:11)
好的,我知道这有点晚了,但我就是这样做的:
NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) {
return [event1.startDateTime compare:event2.startDateTime];
}];
显然,将Event替换为自定义对象的类。这种方法的优点是可以防止将来的重构。如果您要重构并将startDateTime属性重命名为其他内容,Xcode可能不会更改您传递给排序描述符的字符串。突然间,您的排序代码会中断/什么都不做。
答案 3 :(得分:0)
你可以这样做,
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE];
[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
答案 4 :(得分:0)
你可以这样做,
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField" ascending:YES];
NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];