Используйте существующие свойства объекта NSArray для создания нового NSArray для секционного tableView - PullRequest
0 голосов
/ 07 марта 2012

Итак, у меня есть классическая ситуация, когда я хочу сгруппировать мои tableView по месяцам / годам.У меня есть член моего conference объекта с именем beginDateSearchString, который я использую для помещения различных conference в ведра;моя проблема в следующей части, где я пытаюсь и не могу использовать NSSortDescriptor для сортировки каждого сегмента по beginDate (что является датой).

Я получаю ошибку, связанную с unsorted notвозможность получать селекторы типа дескриптора сортировки.

Вот отвратительный код:

- (NSArray *)arrayOfDateSortedEvents {
    NSMutableArray *sortedArray = [[NSMutableArray alloc] init];
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

    //place into buckets

    for (WSConference *conference in self.arrayOfEvents) {
        if (![dictionary objectForKey:[conference beginDateSearchString]]) {
            NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:conference,nil];
            [dictionary setObject:array forKey:[conference beginDateSearchString]];
        }
        else {
            [[dictionary objectForKey:[conference beginDateSearchString]] addObject:conference];
        }
    }

    //sort each bucket by descriptor beginDate

    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];

    for (NSMutableArray *unsorted in dictionary) {
        [unsorted sortUsingDescriptors:sortDescriptors];
    }

    // now, unkey and add dictionary in order

    while ([dictionary count] > 0) {

        NSString *lowest = nil;

        for (NSMutableArray *array in dictionary) {
            if (!lowest)
                lowest = [[dictionary allKeysForObject:array] objectAtIndex:0];
            else {
                if ([(WSConference *)[array objectAtIndex:0] beginDate] < [[dictionary objectForKey:lowest] beginDate])
                    lowest = [[dictionary allKeysForObject:array] objectAtIndex:0];
            }
        }

        [sortedArray addObject:[dictionary objectForKey:lowest]];
        [dictionary removeObjectForKey:lowest];
    }

    return sortedArray;
}

1 Ответ

0 голосов
/ 07 марта 2012

Вы хотите фильтровать массив в дополнение к сортировке.Посмотрите NSPredicate и метод NSArray -filteredArrayUsingPredicate: Затем создайте eventsByDateArray для eventArrays, созданного фильтром.Затем в вашем табличном представлении делегат для создания ячеек, если все упорядочено правильно, первый раздел будет представлять дату событий в eventArray, который является первым объектом eventsByDateArray, а строки таблицы будут состоять из событий в eventArray.,И так для каждой даты.

Добавлено Ваше быстрое перечисление неверно.Вы перечисляете через ключи словаря.Таким образом, в вашем коде несортированный равно каждому ключу, как он перечисляет.Это отличный урок для всех.Неважно, как вы «печатаете» переменную.Когда Objective-C компилируется, он превращает их всех в id.Таким образом, NSMutableArray *unsorted не является NSMutableArray, если он не назначен NSMutableArray.Если вы назначите несортированную строку NSString, это будет строка NSString.Быстрый перечислитель для словаря работает с использованием ключей.Таким образом, в этом случае несортированное становится NSString.

Вместо:

for (NSMutableArray *unsorted in dictionary) {
        [unsorted sortUsingDescriptors:sortDescriptors];
    }

вы должны иметь это:

for (id key in dictionary) {
    NSMutableArray *unsorted = [dictionary objectForKey:key];
    [unsorted sortUsingDescriptors:sortDescriptors];
}
...