Сортировка таблицы основных данных Сортировка по дням недели с использованием NSSortDescriptor - PullRequest
3 голосов
/ 30 января 2010

В настоящее время я пытаюсь отсортировать массив объектов в порядке дня, чтобы их можно было сгруппировать в правильном порядке, то есть в понедельник, вторник, среду, а затем по времени начала.

Единственная проблема в том, что я не могу понять, как это сделать, мой код в настоящее время выглядит так: который сортирует по алфавиту, то по времени:

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;
}

Пожалуйста, помогите!

Ответы [ 2 ]

13 голосов
/ 30 января 2010

Я вижу два решения:

  1. Создайте пользовательское сравнение для вашего дескриптора сортировки, который смотрит на клавишу «день» и упорядочивает их по желанию. См. Определение пользовательских сравнений здесь .
  2. Превратите ключ "день" в целое число и используйте перечисление для значений дня в нужном порядке.

ОБНОВЛЕНИЕ 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];
0 голосов
/ 11 ноября 2012

Я работал с теми же требованиями для пользовательской сортировки разделов, и Решение № 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];

Надеюсь, это поможет!

...