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



У меня есть сущность Company С примерно 20 полями, и я хочу использовать сгруппированный tableView с вручную созданными заголовками разделов (т. е.: General, Financial, Misc.), но я не уверен в том, как сделать так, чтобы основные данные понимали, как обращаться с этими заголовками разделов и чтобы они относились только к данным, которые я хочу показать в этих группах.



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



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



В образце Core books есть такой код:



/*
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];
}


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

592   2  

2 ответов:

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

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

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

Например, у меня есть около 6 полей, связанных с наличными деньгами, таких как "наличные деньги", "marketingBudget", "seoBudget" и т. д и я хотел сгруппировать эти данные в tableView, но проблема была в том, что я не знал, как установить связь с этой таблицей.поле.x принадлежал к группе.x и так далее.

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

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

(корень)

- >CompanyTpl (array)

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

---> Section (String) = "General"

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

----------> ключ = " имя "

----------> Значение = "Название Компании"...

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

, где Value будет отображаться в cellForRowAtIndexPath.

Итак, в моем коде я в основном прошел через раздел (по которому Я имею в виду раздел 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.текстовая метка.текстовое значение.

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

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

Спасибо.

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

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

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

Ie:

[root] CompanyTpl (array)

--> пункт 0 (словарь)

-----> Category (string) = "General"

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

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

---------------> cdFieldName: имя

---------------> дисплей: "название компании"

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

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

Спасибо.

Comments

    Ничего не найдено.