Группирование строк основных данных таблицы данных в разделах, созданных вручную

StackOverflow https://stackoverflow.com/questions/4775080

  •  23-10-2019
  •  | 
  •  

Вопрос

у меня есть Company сущность с около 20 полей, и я хочу использовать сгруппированный обзор таблицы с ручным созданными заголовками раздела (т.е. Они относятся только к данным, которые я хочу показать в этих группах.

Например, имя, логотип и т. Д.

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

В примере основных книг есть этот код:

/*
 The data source methods are handled primarily by the fetch results controller
 */

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[fetchedResultsController sections] count];
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

Но как мне понять, что разделы не в основных данных, но созданы вручную?

Это было полезно?

Решение

У меня сейчас ответ на мою проблему, я не знаю, правильный ли это подход, но он работает и приветствует комментарии.

Просто чтобы уточнить, в чем проблема, и что я пытался сделать.

У меня есть основная сущность данных company Примерно с 10 или около того полей внутри них, однако, вместо того, чтобы перечислить их все за один раз, я хотел сгруппировать выходные поля.

Например, у меня есть около 6 полей, связанных с наличными, такими как «наличные», «MarketingBudget», «Seobudget» и т. Д., И я хотел сгруппировать эти данные по TableView, но проблема была в том, что я не знал, как настроить Отношения, чтобы Table.field.x принадлежал Group.x и т. Д.

Ответ, на который я пришел, заключался в том, чтобы использовать Плист/Словарь, который в значительной степени отражает структуру основного объекта данных; и назначьте структуру группам, которые я хочу отобразить.

Мой словарь выглядит так;

(корень)

-> Companytpl (массив)

-> Пункт 0 (Словарь)

---> раздел (строка) = "Общий"

---> Дети (массив) -------> Пункт 0 (Словарь)

---------->> key = "name"

----------> value = "Название компании" ...

Где Key будет ссылкой на использование основных данных для использования и отображения его содержимого, если это необходимо.

Где Value было бы для отображения на CellForroworAtIndexPath.

Итак, в своем коде я в основном прошел через раздел (под которым я имею в виду раздел TableView), а затем нахожу информацию о корреляции детей из PLIST; и получить ключ/значение и использовать это по мере необходимости.

Вот вырезанная версия кода.

- (void)viewDidLoad {
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"CompanyTpl" ofType:@"plist"];
    self.companyDictionary = [[NSDictionary dictionaryWithContentsOfFile:plistPath] retain];

    // self.tableDataSource is a NSMutableArray
    self.tableDataSource = [self.companyDictionary objectForKey:@"CompanyTpl"];

    // Debugging info
    NSLog(@"Section = 0");

    NSLog(@"%@", [self.tableDataSource objectAtIndex:0]);

    NSLog(@"Section Name = %@", [[self.tableDataSource objectAtIndex:0] objectForKey:@"Section"]);


    NSArray *sectionChildren = [[self.tableDataSource objectAtIndex:0] objectForKey:@"Data"];

    NSLog(@"Section Children = %@", sectionChildren);
    NSLog(@"Count of Section Children = %d", [sectionChildren count]);


}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return ([self.tableDataSource count]);
}

// Section header
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *title = nil;

    title = [[self.tableDataSource objectAtIndex:section] objectForKey:@"Section"];

    return title;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
NSInteger rows = 0;

    NSArray *sectionChildren = [[self.tableDataSource objectAtIndex:section] objectForKey:@"Data"];

    NSLog(@"Section Children = %@", sectionChildren);
    NSLog(@"Count of Section Children = %d", [sectionChildren count]);

    rows = [sectionChildren count];


    return rows;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    NSArray *sectionChildren            = [[self.tableDataSource objectAtIndex:indexPath.section] objectForKey:@"Data"];
    NSDictionary *sectionChildrenData   = [sectionChildren objectAtIndex:indexPath.row];

    //NSLog(@"Section Children data = %@", sectionChildrenData);

    NSString *scKey     = [sectionChildrenData objectForKey:@"Key"];
    NSString *scValue   = [sectionChildrenData objectForKey:@"Value"];

    NSLog(@"scKey = %@", scKey);

    // Grab the data from Core Data using the scKey



    static NSString *CellIdentifier = @"defaultCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];


        //cell.textLabel.text = @"test";

        cell.textLabel.text = scValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    }
    return cell;
}

Идея будет заключаться в том, что я могу использовать ключ при ссылке на данные основных данных для захвата его содержимого и отображения его на контроллере TableView на CellForrowAtIndexPath Cell.TextLabel.Text.

Можно углубиться в глубину и получить больше информации в Плисте, например, каким должен быть подзаголовок и т. Д.

Во всяком случае, приветствует комментарии и мысли.

Спасибо.

Другие советы

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

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    //return [[fetchedResultsController sections] count];

    //NSLog(@"%d", [self.sectionArray count] );

    return 4;
}

// Section header
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *title = nil;

    switch (section) {
        case 0:
            title = @"General";
            break;
        case 1:
            title = @"Finanical";
            break;
        case 2:
            title = @"Category A";
            break;
        case 3:
            title = @"Category B";
            break;
        case 4:
            title = @"Misc";
            break;
        default:
            break;
    }

    return title;
}



// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    /*
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
     */

    NSInteger rows = 0;

    // The number of rows depend on the section
    switch (section) {
        case 0:
            rows = 2;
            break;
        case 1:
            rows = 3;
            break;
        case 2:
            rows = 4;
            break;
        default:
            break;
    }

    return rows;
}

Что это делает, так это вручную создавать 4 секции, имена в данный момент не имеют значения, а затем я создаю различное количество строк для каждого раздела.

Все идет нормально.

Проблема, которую я сталкиваюсь, заключается в том, что основные данные понимают, что в разделе 0.Row0 я хочу, чтобы TextLabel сказал имя компании и т. Д.

Я думаю, что все это должно быть в словаре, выкладывая всю структуру, которую я хочу, и этикетки для отображения; А потом в CellForrowAtIndexPath я отображаю массив в словаре, который я хочу.

т.е.:

root] CompanyTpl (массив)

-> Пункт 0 (Словарь)

-----> Категория (строка) = "Общее"

-----> Данные (массив)

---------> Пункт 0 (Словарь)

---------------> cdfieldName: имя

---------------> Дисплей: «Название компании»

Где CdfieldName является ссылкой на имя поля в данных основных данных, которые я хочу отобразить.

Если есть альтернативный способ сделать это, мне было бы интересно узнать.

Спасибо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top