我有一个Company
实体,大约有20个字段,我想要使用带有手动创建的节标题的分组tableView(即:General,Financial,Misc。),但我不确定如何制作核心数据了解如何处理这些节标题,并使它们仅与我想在这些组中显示的数据相关联。
例如,名称,徽标等将在一般情况下,预算,现金将在财务等下。
基本上,我想控制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];
}
但是如何让它理解这些部分不在Core数据中,而是手动创建?
答案 0 :(得分:1)
我现在已经得到了我的问题的答案,我不知道它是否是正确的方法,但它是有效的,并欢迎评论。
只是为了澄清问题是什么,以及我想要做什么。
我有一个核心数据实体company
,里面有大约10个字段,但不是一次性列出所有字段,我想对输出的字段进行分组。
例如,我有大约6个与现金相关的字段,如“现金”,“marketingBudget”,“seoBudget”等,我想将这些数据分组到tableView上,但问题是我不知道如何设置关系,以便table.field.x属于group.x,依此类推。
我得到的答案是使用一个几乎反映核心数据实体结构的PLIST /字典;并将结构分配给我想要显示的组。
我的字典看起来像这样;
(根)
- &gt; CompanyTpl(数组)
- &GT;项目0(字典)
---&GT; Section(String)=“General”
---&GT;儿童(阵列 ) ------&GT;项目0(字典)
----------&GT; Key =“name”
----------&GT;价值=“公司名称”......
如果需要,Key
将成为Core Data使用和显示其内容的参考。
Value
将在cellForRowAtIndexPath上显示的位置。
所以,在我的代码中,我基本上经历了一节(我指的是tableView部分),然后从PLIST中找到相关的子信息;并获取Key / Value并在需要时使用它。
以下是代码的缩减版。
- (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;
}
我的想法是,我可以在引用Core Data时使用KEY来获取其内容并将其显示在tableView控制器上的cellForRowAtIndexPath cell.textLabel.text值。
可以进一步深入了解并在PLIST中获得更多信息,例如字幕应该是什么等等。
无论如何,欢迎提出意见和建议。
感谢。
答案 1 :(得分:0)
我有一个更接近答案,但我仍然无法连接核心数据项目,以便他们在某些部分。
#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(array)
- &GT;项目0(字典)
- - - - &GT;类别(字符串)=&#34;一般&#34;
- - - - &GT;数据(数组)
---------&GT;项目0(字典)
---------------&GT; cdFieldName:name
---------------&GT;显示:&#34;公司名称&#34;
其中cdFieldName是我想要显示的核心数据中字段名称的引用。
如果有其他方法可以做到这一点,我有兴趣找到答案。
感谢。