Группировка основных данных tableView строк в разделах, созданных вручную - PullRequest
5 голосов
/ 23 января 2011

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

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

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

В примере с книгами Core есть следующий код:

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

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

Ответы [ 2 ]

1 голос
/ 29 января 2011

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

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

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

Например, у меня есть около 6 полей, относящихся к наличным деньгам, таким как «cash», «marketingBudget», «seoBudget» и т. Д., И я хотел сгруппировать эти данные в tableView, но проблема заключалась в том, что я не знал, как установить отношения так, чтобы table.field.x принадлежал group.x и т. д.

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

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

(корень)

-> CompanyTpl (массив)

-> Item 0 (Dictionary)

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

---> Дети (Массив ) ------> Элемент 0 (словарь)

----------> Key = "name"

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

Где 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;
}

Идея состоит в том, что я могу использовать KEY при обращении к Базовым данным, чтобы захватить их содержимое и отобразить его на контроллере tableView со значением cellForRowAtIndexPath cell.textLabel.text.

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

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

Спасибо.

0 голосов
/ 28 января 2011

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

#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 раздела, в настоящий момент названия не имеют значения, а затем я создаю разное количество строк для каждого раздела.

Пока все хорошо.

Проблема, с которой я столкнулся, заключается в том, чтобы Core Data понимала, что в section0.row0 я хочу, чтобы textLabel произнесла название компании и т. Д.

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

есть:

[root] CompanyTpl (массив)

-> Элемент 0 (словарь)

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

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

---------> Item 0 (Dictionary)

---------------> cdFieldName: name

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

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

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

Спасибо.

...