Группировка строк основных данных 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];
}
Но как мне объяснить, что разделы не находятся в основных данных, а создаются вручную?
2 ответов:
Теперь у меня есть ответ на мою проблему, я не знаю, правильный ли это подход, но он работает и будет приветствовать комментарии.
Просто чтобы прояснить, в чем была проблема и что я пытался сделать.У меня есть основная сущность данных
companyС примерно 10 полями внутри них, однако вместо того, чтобы перечислять их все сразу, я хотел сгруппировать выведенные поля.Например, у меня есть около 6 полей, связанных с наличными деньгами, таких как "наличные деньги", "marketingBudget", "seoBudget" и т. д и я хотел сгруппировать эти данные в tableView, но проблема была в том, что я не знал, как установить связь с этой таблицей.поле.x принадлежал к группе.x и так далее.
Ответ, к которому я пришел, состоял в том, чтобы использовать PLIST/словарь, который в значительной степени отражает структуру основной сущности данных; и назначить структуру группам, которые я хочу отобразить.Мой словарь выглядит так;
(корень)
- >CompanyTpl (array)
-- > пункт 0 (Словарь)
---> Section (String) = "General"
- - - > Дети (Массив ) ------ >Пункт 0 (Словарь)
----------> ключ = " имя "
----------> Значение = "Название Компании"...
, где
Keyбудет являться ссылкой на основные данные для использования и отображения их содержимого, если это необходимо., где
Valueбудет отображаться в cellForRowAtIndexPath.Итак, в моем коде я в основном прошел через раздел (по которому Я имею в виду раздел tableView), а затем найти соответствующую информацию о детях из PLIST; и получить ключ/значение и использовать его по мере необходимости.
Вот сокращенная версия кода.
Идея заключается в том, что я могу использовать ключ при ссылке на основные данные, чтобы захватить его содержимое и отобразить его на контроллере tableView в ячейке cellForRowAtIndexPath.текстовая метка.текстовое значение.- (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; }Можно было бы пойти немного дальше в глубину и иметь больше информации в 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