2011-01-23 12 views
5

Ho un'entità Company con circa 20 campi e sto volendo utilizzare una tabella raggruppata con intestazioni di sezione create manualmente (ad esempio: Generale, Finanziario, Varie), ma io sono incerto su come far capire ai Core Data come trattare questi header di sezione e farli riferire solo ai dati che voglio mostrare in questi gruppi.Raggruppamento di tabelle di dati principali Visualizza righe nelle sezioni create manualmente

Ad esempio, il nome, il logo, ecc sarebbe andato sotto il generale, i bilanci, contanti sarebbero andare sotto finanziaria, ecc

Fondamentalmente, io voglio controllare quali dati dai dati Nucleo viene messo in ciascuna categoria e visualizzarli .

Nel campione libri fondamentali c'è questo codice:

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

Ma come faccio a fargli capire che le sezioni non sono i dati fondamentali, ma ha creato manualmente?

risposta

1

Ho una risposta al mio problema ora, non so se è l'approccio corretto, ma funziona e gradirei commenti.

Giusto per chiarire qual era il problema e cosa stavo cercando di fare.

Ho un'entità dati nucleo company con circa 10 campi o meno all'interno di essi, tuttavia piuttosto che elencarli tutti in una volta sola, volevo raggruppare i campi emessi.

Ad esempio, ho circa 6 campi relativi a contante come "cash", "marketingBudget", "seoBudget", ecc. E volevo raggruppare questi dati sul TableView, ma il problema era che non sapevo come impostare una relazione in modo che table.field.x appartenga a group.x e così via.

La risposta a cui sono giunto è stata l'utilizzo di un dizionario PLIST che rispecchia pressoché la struttura dell'entità dei dati di base; e assegna la struttura ai gruppi che voglio mostrare.

Il mio dizionario ha questo aspetto;

(root)

-> CompanyTpl (array)

-> Voce 0 (dizionario)

---> Sezione (String) = "Generale"

---> bambini (Array ) ------> Articolo 0 (dizionario)

---------- > Chiave = "nome"

----------> Value = "Nome Azienda" ...

Qualora il Key sarebbe un punto di riferimento per i Core Data da usare e visualizzazione il suo contenuto, se richiesto.

Dove lo Value dovrebbe essere visualizzato in cellForRowAtIndexPath.

Così, nel mio codice ho praticamente esaminato la sezione (con cui intendo la sezione tableView) e poi trovare le informazioni correlate ai bambini da PLIST; e ottieni la chiave/valore e usalo come e quando richiesto.

Ecco una versione ridotta del codice.

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

L'idea sarebbe quella di poter utilizzare la chiave quando si fa riferimento Core Data per afferrare il suo contenuto e visualizzarlo sul controller tableView al valore cellForRowAtIndexPath cell.textLabel.text.

Si potrebbe andare un po 'più a fondo e avere più informazioni nel PLIST come quello che il sottotitolo dovrebbe essere, ecc

In ogni caso, sarebbe il benvenuto commenti e pensieri.

Grazie.

+0

Ho trovato http://code.google.com/p/coredatalibrary/ che potrebbe essere utile per le persone che desiderano un controllo più avanzato su questo tipo di cose. – zardon

0

Sono un po 'più vicino a una risposta, ma continuo a riscontrare problemi nell'inserire gli elementi dei dati principali in modo che si trovino in determinate sezioni.

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

Quello che fa è creare manualmente 4 sezioni, i nomi non contano in questo momento, e poi creare un diverso numero di righe per ogni sezione.

Finora, tutto bene.

Il problema che sto avendo sta facendo Core Data capire che in section0.row0 voglio il textLabel di dire il nome della società, ecc

sto pensando che tutto questo deve essere in un dizionario , disponendo l'intera struttura che voglio e le etichette da mostrare; e quindi in cellForRowAtIndexPath visualizzo l'array all'interno del dizionario che voglio.

cioè:

[root] CompanyTpl (array)

-> Voce 0 (dizionario)

-----> categoria (stringa) = "Generale"

-----> dati (Array)

---------> Articolo 0 (dizionario)

---------------> cdFieldName: nome

---------------> Display: "Nome azienda"

Dove cdFieldName è un riferimento al nome del campo all'interno dei dati di base che voglio visualizzare.

Se c'è un modo alternativo per farlo, sarei interessato a scoprirlo.

Grazie.

Problemi correlati