UITableView группирует разделы из NSMutableArray

У меня есть приложение, которое в основном читает XML файл и отображает результаты в UITableView. Я пытаюсь сгруппировать элементы списка по "стране" (атрибуту элементов XML файла) и отобразить их в разделах UITableView.

В настоящее время я читаю xml файл и сохраняю каждый элемент в качестве настраиваемого объекта в NSMutableArray. Массив имеет следующую структуру:

Массив: 0 = > (название, описание, дата, страна) 1 = > (название, описание, дата, страна) 2 = > (название, описание, дата, страна) 3 = > (название, описание, дата, страна)

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

if(![countryArray containsObject:itemCountry]) //if country not already in array
{
   [countryArray addObject:itemCountry]; //Add NSString of country name to array
}

Где itemCountry - атрибут страны для каждого элемента, когда я просматриваю xml файл.

[countryArray count]; //gives me the amount of sections needed

Итак, я думаю, мой вопрос заключается в том, как мне решить, сколько строк нужно делать в каждом разделе? Как отображать правильные элементы массива для каждого раздела?

Любая помощь или указатели были бы хороши

Ответ 1

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

NSMutableDictionary * theDictionary = [NSMutableDictionary dictionary];

// Here `customObjects` is an `NSArray` of your custom objects from the XML
for ( CustomObject * object in customObjects ) {   
    NSMutableArray * theMutableArray = [theDictionary objectForKey:object.country];
    if ( theMutableArray == nil ) {
        theMutableArray = [NSMutableArray array];
        [theDictionary setObject:theMutableArray forKey:object.country];
    } 

    [theMutableArray addObject:object];
}

/* `sortedCountries` is an instance variable */
self.sortedCountries = [[theDictionary allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

/* Save `theDictionary` in an instance variable */
self.theSource = theDictionary;

Позже в numberOfSectionsInTableView:

- (NSInteger)numberOfSectionsInTableView {
    return [self.sortedCountries count];
}

В tableView:numberOfRowsInSection::

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[self.theSource objectForKey:[self.sortedCountries objectAtIndex:section]] count];
}

В tableView:cellForRowAtIndexPath::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    [..]

    /* Get the CustomObject for the row */
    NSString * countryName = [self.sortedCountries objectAtIndex:indexPath.section];
    NSArray * objectsForCountry = [self.theSource objectForKey:countryName];
    CustomObject * object = [objectsForCountry objectAtIndex:indexPath.row];

    /* Make use of the `object` */

    [..]
}

Это должно пройти весь путь.

Боковое примечание
Если бы они не представляли данные и просто получали подсчет стран, то лучшей альтернативой подходу PengOne является использование NSCountedSet.

NSCountedSet * countedSet = [NSCounted set];
for ( NSString * countryName in countryNames ) {
    [countedSet addObject:countryName];
}

Теперь все уникальные страны доступны в [countedSet allObjects], и подсчет для каждой страны будет [countedSet countForObject:countryName].

Ответ 2

Для заголовков разделов, использующих ответ Deepak, просто перейдите:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.sortedCountries objectAtIndex:section];
}

Ответ 3

Вероятно, вы не должны создавать несколько массивов, а создавать массив словарей. Поэтому создайте измененный массив под названием counties или wtv и рекламные словари, содержащие название, имя и т.д. Чтобы создать словарь, довольно просто создать объект NSMutableDictionary, а затем использовать метод setValue:forKey:, чтобы добавить к нему что-то. Для названия страны значением будет имя и ключ по стране. Надеюсь, это поможет.