iPhone - Помощь с добавлением 9 различных разделов внутри UITableView - PullRequest
1 голос
/ 12 марта 2011

У меня есть NSArray объектов:

MyObject состоит из следующих строковых свойств:

Title
Category
Name

Всего имеется 9 категорий.

Я хотел бы отобразить эти категории в виде UITableView.

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;` as well.

    for (ArrayOfMyObject *item in myArray) {
      if ([item.Category isEqualToString:@"Category1"]) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
        [self.itemsArray addObject:dict];
      }

      if ([item.Category isEqualToString:@"Category2"]) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
        [self.itemsArray addObject:dict];
      }
      ... (etc, for the rest of the Category titles).
    }

Я должен получить всего 9 разделов, если есть 9 категорий, но похоже, что я на самом деле получаю общее количество элементов (таких как 76).Любая помощь будет принята с благодарностью и не стесняйтесь запрашивать больше кода, если это будет необходимо.

Я думаю, мне также нужно знать, как справиться с этим в методе cellForRowAtIndexPath.

БудетЯ делаю что-то вроде этого?

MyObject *item = (MyObject *)[self.itemsArray objectAtIndex:indexPath.row];
NSMutableDictionary *dictionary = [self.itemsArray objectAtIndex:indexPath.section];
NSArray *categoryArray = [dictionary objectForKey:item.Category];

1 Ответ

3 голосов
/ 12 марта 2011

Я бы начал с организации вашего источника данных другим способом.

Получите источник данных NSArray, который содержит 9 NSDictionaries, представляющих ваши категории. Внутри каждой категории у вас есть пара ключей - один для соответствующей строки с именем категории и один для соответствующего массива MyObjects, которые принадлежат категории:

dataSource [
             item1 {
                     catName = @"CategoryName 1"
                     objects = NSArray of MyObjects for catName1
                   }
             item2 {
                     catName = @"CategoryName 2"
                     objects = NSArray of MyObjects for catName2
                   }
             etc...
           ]

Как только вы упорядочите данные таким образом, ваши методы источника данных для табличного представления будут выглядеть (концептуально):

numberOfSections можно получить с помощью [datasource count]

titleForSection можно получить с помощью [[datasource objectAtIndex:indexPath.section] valueForKey:@"catName"]

numberOfRowsInSection можно получить с помощью [[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] count]

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

Имеет смысл? Дайте знать, если у вас появятся вопросы. Ура, Рог

[РЕДАКТИРОВАТЬ, ЧТОБЫ ОТВЕТИТЬ НА СЛЕДУЮЩИЙ ВОПРОС]

Это основано на нескольких предположениях, но вы должны понять суть этого. Для проверки этого я создал класс 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);
    // Use and release your datasource as appropriate
    // You may want to sort your datasource appropriately depending on your needs
}
...