我有对象Item
,它只有两个NSDate
属性
从这些属性来看,对我来说唯一重要的部分就是时间
如果有可能这不是NSDate,那么它只能是@"14:30"
和@"17:30"
的NSString。
我有10个不同时间的对象,它们位于NSMutableArray
我需要对所有这些对象进行排序以将它们加载到表中
我尝试了一些但没有运气(实际上这个代码适用于一个属性)有两个属性:
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
[components setHour:12];
NSDate *todayA = [calendar dateFromComponents:components];
[components setHour:11];
NSDate *todayB = [calendar dateFromComponents:components];
[components setHour:10];
NSDate *todayC = [calendar dateFromComponents:components];
Item* i1 = [[Item alloc] init];
i1.DateTimeA = todayA;
Item* i2 = [[Item alloc] init];
i2.DateTimeA = todayB;
Item* i3 = [[Item alloc] init];
i3.DateTimeA = todayC;
[array addObject:i1];
[array addObject:i2];
[array addObject:i3];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"DateTimeA" ascending:NO];
NSArray *orderedArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
正如我所说Item
DateTimeA
而DateTimeB
并不一定是NSDate
他们只能是字符串,但我必须能够按这两个字符排序属性。
对此有什么解决方案吗?
答案 0 :(得分:1)
试试:
array = [array sortedArrayUsingComparator:^(Item *i1, Item *i2) {
NSDateFormatter* df1 = [[NSDateFormatter alloc] init];
[df1 setDateFormat:@"d/LLL/yy"]; // <-- make sure it match your date format
NSDate* date1 = [df1 dateFromString:i1.DateTimeA];
NSDate* date2 = [df1 dateFromString:i2.DateTimeA];
return [date2 compare:date1];
}];
这只是示例,但您可以自定义它以符合您的要求。 在这个例子中,我假设DateTimeA总是NSString,但你应该首先将它颊,如果它是NSDate,你可以省略格式位。
例如:
if ([i1.DateTimeA isKindOfClass:[NSDate class]])
NSDate* date1 = i1.DateTimeA;
if ([i2.DateTimeA isKindOfClass:[NSDate class]])
NSDate* date2 = i2.DateTimeA;
return [date2 compare:date1];
答案 1 :(得分:1)
这应该是技巧
NSArray *sortedArray = [array sortedArrayUsingComparator:^(Item *i1, Item *i2) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"HHmmss"];
NSDate* date1A = [dateFormatter dateFromString:[dateFormatter stringFromDate:i1.DateTimeA]];
NSDate* date2A = [dateFormatter dateFromString:[dateFormatter stringFromDate:i2.DateTimeA]];
NSDate* date1B = [dateFormatter dateFromString:[dateFormatter stringFromDate:i1.DateTimeB]];
NSDate* date2B = [dateFormatter dateFromString:[dateFormatter stringFromDate:i2.DateTimeB]];
switch ([date1A compare:date2A]) {
case NSOrderedSame:
return [date1B compare:date2B];
break;
default:
return [date1A compare:date2A];
break;
}
}];
它不是很漂亮,但它会做你想要的,请注意,如果你让DateTimeA和DateTimeB以HH:mm等格式存储为字符串,你将不需要这样,你需要只做:
[dateFormatter dateFromString:DateTimeA];
还有一件事要避免使用大写字母启动iVars和属性名称,这确实令人困惑。
希望这有帮助。