在手动创建的部分中对核心数据tableView进行分组

时间:2011-01-23 17:07:00

标签: uitableview core-data manual

我有一个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数据中,而是手动创建?

2 个答案:

答案 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;

其中cdFi​​eldName是我想要显示的核心数据中字段名称的引用。

如果有其他方法可以做到这一点,我有兴趣找到答案。

感谢。