5

約 20 のフィールドを持つCompanyエンティティがあり、手動で作成されたセクション ヘッダー (つまり、一般、財務、その他) を含むグループ化された tableView を使用したいのですが、コア データにこれらのセクションの処理方法を理解させる方法がわかりません。ヘッダーを作成し、これらのグループに表示したいデータのみに関連付けるようにします。

たとえば、名前、ロゴなどは一般、予算、現金は財務などに分類されます。

基本的には、コアデータからどのデータを各カテゴリに入れて表示するかを制御したいです。

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

しかし、セクションが Core データではなく、手動で作成されたものであることを理解させるにはどうすればよいでしょうか?

4

2 に答える 2

1

私は今、私の問題に対する答えを持っています。それが正しいアプローチかどうかはわかりませんが、それは機能しており、コメントを歓迎します。

何が問題で、何をしようとしているのかを明確にするためです。

内部に約 10 個ほどのフィールドを持つコア データ エンティティcompanyがありますが、一度にすべてをリストするのではなく、出力されたフィールドをグループ化したいと考えていました。

たとえば、「cash」、「marketingBudget」、「seoBudget」など、現金に関するフィールドが 6 つほどあり、このデータを tableView でグループ化したいのですが、設定方法がわからないという問題がありました。 table.field.x が group.x に属するような関係など。

私がたどり着いた答えは、コア データ エンティティの構造をほぼ反映した PLIST/辞書を使用することでした。表示したいグループに構造を割り当てます。

私の辞書は次のようになります。

(根)

->CompanyTpl (配列)

--> 項目 0 (辞書)

---> セクション (文字列) = "全般"

---> 子 (配列) ------> 項目 0 (辞書)

----------> キー = "名前"

----------> 値 = "会社名" ...

Key必要に応じて、Core Data がその内容を使用および表示するための参照となる場所。

ValuecellForRowAtIndexPath で表示される場所。

したがって、私のコードでは、基本的にセクション (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;
}

Core Data を参照するときに KEY を使用してその内容を取得し、cellForRowAtIndexPath cell.textLabel.text 値で tableView コントローラーに表示できるという考えです。

もう少し深く掘り下げて、サブタイトルがどうあるべきかなど、PLIST に詳細情報を含めることができます。

とにかく、コメントや考えを歓迎します。

ありがとう。

于 2011-01-29T13:36:32.837 に答える
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 に、必要な辞書内に配列を表示します。

すなわち:

[ルート] CompanyTpl (配列)

--> 項目 0 (辞書)

-----> カテゴリ (文字列) = "全般"

-----> データ (配列)

----------> 項目 0 (辞書)

---------------> cdFieldName: 名前

---------------> 表示:「会社名」

cdFieldName は、表示する Core Data 内のフィールド名への参照です。

これを行う別の方法があれば、私はそれを見つけることに興味があります。

ありがとう。

于 2011-01-28T16:47:34.313 に答える