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 словари, которые содержат название,имя и т. д. Чтобы создать словарь, достаточно просто создать