UITableView группировка разделов из NSMutableArray - PullRequest
11 голосов
/ 18 июня 2011

У меня есть приложение, которое в основном читает файл 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 - это атрибут страны каждого элемента в цикле i в файле xml.

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

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

Любая помощь или указатели были бы замечательно

Ответы [ 3 ]

21 голосов
/ 19 июня 2011

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

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

3 голосов
/ 12 февраля 2013

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.sortedCountries objectAtIndex:section];
}
0 голосов
/ 19 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...