Как установить сгруппированные имена секций UITableview без NSFetchedResultsController в игре - PullRequest
0 голосов
/ 27 сентября 2011

Я использовал несколько сгруппированных таблиц, привязанных к управляемым объектам основных данных, где значение 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?

Спасибо,

Фил

1 Ответ

1 голос
/ 27 сентября 2011

Вы можете сделать что-то вроде этого:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSMutableSet *counter = [[NSMutableSet alloc] init];
    [arrayOfSims enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
        [counter addObject:object.catName];
    }];
    NSInteger cnt = [counter count];
    [counter release];
    return cnt;
}

вы, вероятно, захотите запомнить это по соображениям производительности (но только после его профилирования).

--- EDIT --

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

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
    NSMutableDictionary *counter = [[NSMutableDictionary alloc] init];
    __block NSNumber *countOfElements;
    [arrayOfSims 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];
      } else {
        [counter setObject:[NSNumber numberWithInt:1] forKey:object.catName];
      }

    }];
  NSInteger cnt = [counter count];
  // we can also get information about each category name, if we choose                                                                                                                                                                       
  [counter release];
  return cnt;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...