Я вижу два решения:
- Создайте пользовательское сравнение для вашего дескриптора сортировки, который смотрит на клавишу «день» и упорядочивает их по желанию. См. Определение пользовательских сравнений здесь .
- Превратите ключ "день" в целое число и используйте перечисление для значений дня в нужном порядке.
ОБНОВЛЕНИЕ 2 Пример кода для варианта 2:
-Измените атрибут «день» на число (Int16) и добавьте временный (непостоянный) строковый атрибут «dayName».
-Добавить это перечисление дней недели:
typdef enum {
kMonday,
kTuesday,
kWednesday,
kThursday,
kFriday,
kSaturday,
kSunday
} WeekDay;
- Установите свойство day для ваших управляемых объектов как NSNumber. Например:
object.day = [NSNumber numberWithInteger:kMonday];
- Реализовать функцию получения для переходного свойства "dayName":
- (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;
}
}
-В запросе на выборку сортируйте по «дню» и используйте «dayName» в качестве пути к ключу имени раздела.
UPDATE
Примечание: Вариант 1 отлично работает для сортировки массива, но Core Data генерирует исключение NSInvalidArgumentException для неподдерживаемого селектора NSSortDescriptor: weekdayCompare: '
Пример кода для варианта 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];