Группирование строк основных данных таблицы данных в разделах, созданных вручную
-
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 является ссылкой на имя поля в данных основных данных, которые я хочу отобразить.
Если есть альтернативный способ сделать это, мне было бы интересно узнать.
Спасибо.