Я использовал несколько сгруппированных таблиц, привязанных к управляемым объектам основных данных, где значение sectionNameKeyPath используется для идентификации атрибута в данных, который следует использовать для обозначения разделов для таблицы.
Но как мне указать «эквивалент sectionNameKeyPath», когда у меня есть таблица, которая используется для представления NSMutableArray, полного объектов, которые выглядят так:
@interface SimGrade : NSObject {
NSNumber * scoreValue;
NSString * commentInfo;
NSString * catName;
}
Я бы хотелиметь разделы, определенные в соответствии с членом класса "catName".
Рассмотрим, например, что у моего mutablearray есть 5 записей, где 5 значений "catName" - "Blue", "Blue", "Blue",«Красный» и «Красный».Поэтому я бы хотел, чтобы количество разделов в таблице для этого примера было 2.
Итак, то, что я «хотел бы сделать», можно представить следующим псевдокодом:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return (The number of unique catNames);
}
Примечание: я заинтересован в том, чтобы сделать это не столько для отображения отдельных разделов в таблице, сколько для того, чтобы мне было легче вычислить суммы значений ScoreValues для каждой категории.
<<<<<ОБНОВЛЕНИЕ >>>>>>>>>
Помощь Джошуа, как было задокументировано в его ответе, была правильной.Вот два новых обработчика для числа разделов и количества строк в разделе ...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSMutableSet *counter = [[NSMutableSet alloc] init];
[tableOfSimGrades enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
[counter addObject:[object catName]];
}];
NSInteger cnt = [counter count];
[counter release];
NSLog(@">>>>> number of sections is -> %d", cnt);
return cnt;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
NSMutableDictionary *counter = [[NSMutableDictionary alloc] init];
NSMutableArray *cats = [[NSMutableArray alloc] init];
__block NSNumber *countOfElements;
[tableOfSimGrades enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
// check the dictionary for they key, if it's not there we get nil
countOfElements = [counter objectForKey:[object catName]];
if (countOfElements) {
// NSNumbers can't do math, so we use ints.
int curcount = [countOfElements intValue];
curcount++;
[counter setObject:[NSNumber numberWithInt:curcount] forKey:[object catName]];
NSLog(@">>>> adding object %d to dict for cat: %@", curcount, [object catName]);
} else {
[counter setObject:[NSNumber numberWithInt:1] forKey:[object catName]];
[cats addObject:[object catName]];
NSLog(@">>>>> adding initial object to dict for cat: %@", [object catName]);
}
}];
countOfElements = [counter objectForKey:[cats objectAtIndex: section]];
int catcount = [countOfElements intValue];
[counter release];
[cats release];
return catcount;
}
Моя текущая проблема с этой подпрограммой теперь заключается в следующей функции ... Она не знает ни о каких разделах вnsmutableArray и т. д. для каждого раздела он начинается с индекса 0 массива, а не с 0-го элемента соответствующего раздела.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
SimGrade *tmpGrade = [[SimGrade alloc] init];
tmpGrade = [tableOfSimGrades objectAtIndex: indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Category: %@", tmpGrade.catName];
// [tmpGrade release];
return cell;
}
Как преобразовать «indexpath», отправленный этой подпрограмме, всоответствующий раздел mutableArray?
Спасибо,
Фил