UITableView группировка разделов из NSMutableArray

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

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

массив: 0 => (название, описание, дата, страны) 1 => (название, описание, дата, страны) Два = > (название, описание, дата, страна) 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

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

любая помощь или указатели было бы здорово

3 ответов


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

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].


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

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

вы, вероятно, не должны создавать несколько массивов, а создавать массив словарей. Поэтому создайте изменяемый массив под названием counties или WTV и ADS словари, которые содержат название,имя и т. д. Чтобы создать словарь, достаточно просто создать