Сортировать по дате: NSArray с NSArray с Date-Object - PullRequest
0 голосов
/ 10 августа 2011

У меня есть простой NSArray, у которого есть несколько массивов в качестве объектов, которые имеют несколько дат и строки в качестве объектов:

  • NSArray (основной массив) ---------------> табличное представление
    • NSArray (вторичный массив) ---> ячейка табличного представления
      • NSDate --------------------> Текстовая метка ячейки табличного представления
      • NSString -------------------> текстовая метка ячейки табличного представления
      • и т.д.

Я использую основной массив для своего представления таблицы -> каждая ячейка имеет свой «вторичный массив». Теперь я хочу отсортировать основной массив по объекту NSDate. Звучит очень просто, но я не нашел в Интернете решения для этого.

Я думал об использовании NSSortDesriptors, но они просто сортируют массив по объектам в основном массиве, а не во вторичном массиве.

Надеюсь, вы поможете мне

РЕДАКТИРОВАТЬ: Исправит ли это проблему, если я использую NSDictionary в качестве вторичного массива?

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Вы должны иметь возможность использовать NSArray sortedArrayUsingComparator, если ваше приложение предназначено для iOS 4.0 или более поздней версии:

NSArray *sortedArray = [mainArray sortedArrayUsingComparator: ^(id obj1, id obj2) {
    return [[obj1 objectAtIndex:0] compare:[obj2 objectAtIndex:0]];
}];

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

1 голос
/ 10 августа 2011

Если я правильно понял вашу структуру данных, это должно быть близко:

NSArray *sortedArray = [mainArray sortedArrayUsingComparator:^(id ary1, id ary2) {
    NSArray *array1 = (NSArray *)ary1;
    NSArray *array2 = (NSArray *)ary2;
    NSDate *date1 = (NSDate *)[array1 objectAtIndex:0];
    NSDate *date2 = (NSDate *)[array2 objectAtIndex:0];
    return [date1 compare:date2];
}];
...