Ios 如何按两个时间属性对NSArray中的自定义对象进行排序

Ios 如何按两个时间属性对NSArray中的自定义对象进行排序,ios,objective-c,nsmutablearray,nssortdescriptor,Ios,Objective C,Nsmutablearray,Nssortdescriptor,我有objectItem,它只有两个NSDate属性。 从这些属性来看,对我来说唯一重要的部分就是时间。 如果可能的话,它不必是NSDate,也可以是NSString,只有一个@“14:30”和@“17:30” 我有10个不同时间的对象,它们位于NSMutableArray 我需要对所有这些对象进行排序,以便将它们加载到表中。 我尝试了两个属性,但运气不佳(实际上此代码适用于一个属性): NSDate *now = [NSDate date]; NSCalendar *calendar

我有object
Item
,它只有两个
NSDate
属性。
从这些属性来看,对我来说唯一重要的部分就是时间。
如果可能的话,它不必是NSDate,也可以是NSString,只有一个
@“14:30”
@“17:30”

我有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
它们只能是字符串,但我必须能够根据这两个属性进行排序。
有什么解决办法吗?

试试:

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];
                         }];
这应该是诀窍

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];
还有一件事要避免在IVAR和属性名称的开头使用大写字母,因为大写字母会让人感到困惑


希望这能有所帮助。

如果我理解正确,您只想按时间排序,而不管日期是从哪天开始的?是的,先生。只有时间。正如我所说,它可以是和字符串只与时间。如果你费心阅读NSArray规范,你会看到其他几种“SorterDarrayUsing…”方法。
[dateFormatter dateFromString:DateTimeA];