【问题标题】:Core Data Table View Section Sort by weekdays using NSSortDescriptor核心数据表视图部分使用 NSSortDescriptor 按工作日排序
【发布时间】:2011-01-11 04:58:47
【问题描述】:

我目前正在尝试将我的对象数组按天顺序排序,以便它们可以按正确的顺序分组,即星期一、星期二、星期三,然后按开始时间。

唯一的问题是我不知道该怎么做,我的代码目前看起来像这样:按字母顺序然后按时间排序:

NSString *sectionKey = nil;
switch (tab) {

case kByWeekA: {
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:NO];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"starttime" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];
sectionKey = @"day";
break;
}
case kByWeekB:{
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"starttime" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];
sectionKey = @"day";
break;
}
default:
break;
}

请帮忙!

【问题讨论】:

  • 您的案例 A 和 B 块具有相同的代码。我猜B应该是按starttime排序的情况吧?

标签: iphone core-data nsfetchedresultscontroller nssortdescriptor


【解决方案1】:

我看到了两种解决方案:

  1. 为您的排序描述符创建一个自定义比较,查看“day”键并根据需要对其进行排序。请参阅指定自定义比较here
  2. 将“day”键设为整数,并按所需顺序对日期值使用枚举。

更新 2 选项 2 的示例代码:

-将“day”属性更改为数字(Int16)并添加瞬态(非持久)“dayName”字符串属性。

-添加这个星期的枚举:

typdef enum {
    kMonday,
    kTuesday,
    kWednesday,
    kThursday,
    kFriday,
    kSaturday,
    kSunday
} WeekDay;

-将托管对象的“day”属性设置为 NSNumber 对象。例如:

object.day = [NSNumber numberWithInteger:kMonday];

-为瞬态“dayName”属性实现getter函数:

- (NSString*)dayName {
    switch ((WeekDay)self.day.integerValue) {
        case kMonday:
            return @"Monday";
            break;
        case kTuesday:
            return @"Tuesday";
            break;
        case kWednesday:
            return @"Wednesday";
            break;
        case kMonday:
            return @"Monday";
            break;
        case kThursday:
            return @"Thursday";
            break;
        case kFriday:
            return @"Friday";
            break;
        case kSaturday:
            return @"Saturday";
            break;
        case kSunday:
            return @"Sunday";
            break;
    }
}

-在获取请求中,按“day”排序,使用“dayName”作为section name key path。

更新
注意:选项 1 适用于对数组进行排序,但 Core Data 会为“不支持的 NSSortDescriptor 选择器:weekdayCompare:”抛出“NSInvalidArgumentException”异常

选项 1 的示例代码:

// category on NSString for custom comparison
@interface NSString (WeekdayComparison)
- (NSComparisonResult)weekdayCompare:(NSString*)otherDay;
@end
@implementation NSString (WeekdayComparison)
- (NSComparisonResult)weekdayCompare:(NSString*)otherDay {
    NSArray *weekDays = [NSArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", nil];

    NSUInteger selfIndex = [weekDays indexOfObject:self];
    NSUInteger otherDayIndex = [weekDays indexOfObject:otherDay];

    if (selfIndex < otherDayIndex) {
        return NSOrderedAscending;
    }
    else if (selfIndex > otherDayIndex) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}
@end

使用新的比较方法:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:YES selector:@selector(weekdayCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[sortDescriptor release];

【讨论】:

  • 我想使用第一个解决方案,但我很挣扎!我试图将日期键与日期字符串数组进行比较,但无法使其正常工作?关于如何实施第一个解决方案的任何建议或提示?非常感谢
  • 我已经在一个新类中实现了比较,并将方法调用中的“self”更改为“day”,但得到 'NSInvalidArgumentException',原因:'unsupported NSSortDescriptor selector: weekdayCompare:'error .我在错误的地方实施它吗?
  • 如果我选择第二种解决方案,我将如何将 int 显示为字符串,如果 NSInteger day = 0 然后显示星期一...任何帮助将不胜感激!
  • 比较方法属于“类别”。您可以将其接口和实现都放在您计划使用它的实现 (.m) 文件的顶部。您也可以将其放在单独的文件中,但您必须导入标头(.h)。
  • 使用第二种解决方案,您将创建一个方法来返回给定整数的字符串(使用 switch 语句)。
【解决方案2】:

我在处理部分自定义排序的相同要求时,解决方案 #1 非常适合我,谢谢!

我想补充一点,如果您的应用在加载几秒钟后神秘地崩溃了,那么在添加瞬态属性之后,您需要重置您的数据库。

NSError *error;
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *databaseURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"My Database Name"];
[[NSFileManager defaultManager] removeItemAtPath:databaseURL.path error:&error];

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多