Objective-C iPhone - Упорядочивание данных в нескольких разделах источника данных UITableView - PullRequest
3 голосов
/ 14 марта 2011

Для того, чтобы задать этот вопрос о заказе. Следующий класс MyObject возвращает экземпляр со случайно сгенерированными именами категорий.

Я использую следующие dataSource методы:

numberOfSections доступ с помощью [dataSource count].

titleForSection доступ с помощью [[dataSource objectAtIndex:indexPath.section] valueForKey:@"categoryName"].

numberOfRowsInSection доступ с помощью [[[dataSource objectAtIndex:indexPath.section] valueForKey:@"myObjects"] count].

И, наконец, MyObject для каждой строки вызывается с помощью [[[dataSource objectAtIndex:indexPath.section] valueForKey:@"myObjects"] objectAtIndex:indexPath.row] в методе cellForRowAtIndexPath.

Я использую следующий код для создания dataSource, который отображает 9 категорий разделов, однако я немного застрял в порядке расположения этих категорий и данных внутри. Предположим, есть свойство NSDate как часть класса MyObject.

Вопрос: Как мне использовать это для отображения записей в порядке убывания?

- (void)createDatasource
{
    NSInteger numberOfObjects = 10;
    NSMutableArray *objects = [NSMutableArray arrayWithCapacity:numberOfObjects];
    NSMutableArray *categories = [NSMutableArray arrayWithCapacity:numberOfObjects];
    for (int i = 0; i < numberOfObjects; i++)
    {
        MyObject *obj = [[MyObject alloc] init];
        [objects addObject:obj];
        [categories addObject:obj.category];
        [obj release];
    }
    NSSet *set = [NSSet setWithArray:categories];
    NSMutableArray *dataSource = [[NSMutableArray alloc] initWithCapacity:[set count]];
    for (NSString *categoryString in set)
    {
        NSMutableDictionary *mainItem = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil, @"categoryName", nil, @"myObjects", nil];
        NSMutableArray *mainItemMyObjects = [NSMutableArray array];
        [mainItem setValue:categoryString forKey:@"categoryName"];
        for (MyObject *obj in objects)
        {
            if ([obj.category isEqualToString:categoryString])
            {
                [mainItemMyObjects addObject:obj];
            }
        }
        [mainItem setValue:mainItemMyObjects forKey:@"myObjects"];
        [dataSource addObject:mainItem];
        [mainItem release];
    }
    NSLog (@"objects = %@\ncategories = %@\nset = %@\ndatasource = %@", objects, categories, set, dataSource);
}

1 Ответ

2 голосов
/ 14 марта 2011

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


Редактировать Запрошенный пример кода для сортировки, что-то вродеэто должно работать.Я предполагаю, что вы хотите отсортировать все по свойству с именем date в MyObject.

// First, sort the myObject mutable array in each category
for (NSDictionary *d in dataSource) {
    [[d valueForKey:@"myObjects"] sortUsingComparator:^NSComparisonResult(id o1, id o2){
        // Compare dates. NSDate's 'compare:' would do ascending order, so if we just
        // reverse the order of comparison they'll come out descending.
        return [[o2 date] compare:[o1 date]];
    }];
}

// Second, sort the categories by the earliest dated object they contain
[dataSource sortUsingComparator:^NSComparisonResult(id o1, id o2){
    // Extract the first object from each category's array, which must be the
    // earliest it contains due to the previous sort.
    MyObject *myObject1 = [[o1 valueForKey:@"myObjects"] objectAtIndex:0];
    MyObject *myObject2 = [[o2 valueForKey:@"myObjects"] objectAtIndex:0];

    // Compare dates, as above.
    return [[myObject2 date] compare:[myObject1 date]];
}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...