2011-01-23 13 views
5

約20フィールドのCompanyエンティティがあり、手動で作成されたセクションヘッダー(つまりGeneral、Financial、Misc。)でグループ化されたtableViewを使用したいと思います。コアデータにこれらのセクションヘッダーを扱う方法を理解させ、これらのグループで表示したいデータにのみ関連付ける方法を理解することができません。コアデータテーブルのグループ化手動で作成されたセクションの行の表示

一般の下で行くだろうたとえば、名前、ロゴなどのために、予算は、現金は基本的に、私はコアデータからのデータは、各カテゴリに入れますかを制御し、それを表示するなど、財政の下で

を行くだろう。コア書籍のサンプルで

このコードがある:

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

しかし、どのように私はそれがセクションがコアデータではないことを理解させるんが、手動で作成?

答えて

1

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

問題が何であるか、私が何をしようとしているかを明確にするだけです。

私はコアデータエンティティcompanyを持っていますが、その中に約10個のフィールドがありますが、それらをすべて一挙にリストするのではなく、出力フィールドをグループ化したいと考えました。

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

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

私の辞書は次のようになっています。

(ルート)

- > CompanyTpl(アレイ)

- >アイテム0(辞書)

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

--->子供(配列 ) ------>アイテム0(辞書)

---------- >キー=「名前」

---------->値=「会社名」... Keyは、コアデータを使用するための参照と表示となり

必要に応じてその内容

ValueがcellForRowAtIndexPathで表示するだろうだろう

だから、私のコードでは、私は基本的に(それによって私はの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; 
} 

アイデアは、その内容を取得し、cellForRowAtIndexPath cell.textLabel.text値でのtableViewコントローラ上でそれを表示するには、コアデータを参照するとき、私はKEYを使用できることになります。

一つは、深さにさらに少し行くと、このような字幕がどうあるべきかなどPLISTでより多くの情報を持っている、など

はとにかく、コメントや考えを歓迎することができます。

ありがとうございました。

+0

私はこの種のものをより高度に制御したい人には便利なhttp://code.google.com/p/coredatalibrary/を見つけました。 – zardon

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つのセクションを作成され、名前が現時点では問題ではない、と私はセクションごとに異なる数の行を作成します。

これまでのところ、とても良いです。

私がいる問題は、コアデータを作っているがsection0.row0に、私はtextLabelは、会社名を言いたいことなどを理解

私はこのすべてが辞書になければならないことと思っています、私が望む構造全体をレイアウトし、ラベルを表示する。 cellForRowAtIndexPathに、私が望む辞書内の配列を表示します。

すなわち:

[ルート] CompanyTpl(配列)

- >項目0(辞書)

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

----->データ(アレイ)

--------->アイテム0(辞書)

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

--------------->ディスプレイ: "会社名"

ここで、cdFieldNameは、表示するコアデータ内のフィールド名への参照です。

これを行う別の方法がある場合は、私は調べることに興味があります。

ありがとうございました。

関連する問題