• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

T#020 – Creiamo Table View raggruppate e divise in sezioni

By Redazione | on 6 Gennaio 2010 | 22 Comments
Senza categoria

Fino ad oggi abbiamo parlato e illustrato solo teoricamente cosa sono e come si possono personalizzare le Table View, strumenti utili e praticamente indispensabili per la maggior parte delle applicazioni presenti in App Store. Oggi vedremo, con un esempio pratico, come creare una Table View, come popolarla con i nostri dati e come personalizzare e sfruttare alcune proprietà offerte da questo tipo di oggetto. Creeremo quindi una tabella raggruppata e divisa in sezioni in modo da offrirvi una prima panoramica abbastanza ampia su questo argomento.

Iniziamo con il nostro tutorial. Apriamo Xcode e creiamo un nuovo progetto. Dall’elenco dei template disponibili scegliamo “Navigation-based Application” e proseguiamo. Diamo un nome al nostro progetto, ad esempio “myTable”, scegliamo la posizione dove salvare e proseguiamo. In realtà, inconsapevolmente, abbiamo già creato la nostra tabella, lavoro svolto automaticamente da Xcode grazie al template “Navigation-based” che ci fornisce un’interfaccia utente già configurata con un navigation controller pronto a mostrare una lista di oggetti (ovvero i dati della nostra tabella che andremo ad inserire a breve). Apriamo il file RootViewController.h e andiamo a dichiarare gli elementi che ci serviranno nel nostro progetto:

@interface RootViewController : UITableViewController {

	NSMutableArray *listaOggetti;
	NSMutableArray *listaDettaglioOggetti;
}

@end

Non abbiamo fatto altro che dichiarare due oggetti di tipo NSMutableArray chiamati rispettivamente listaOggetti e listaDettaglioOggetti. In listaOggetti memorizzeremo gli elementi della nostra tabella, mentre dentro listaDettaglioOggetti ci saranno i sottotitoli di ogni elemento della tabella stessa.

Salviamo e passiamo al relativo file di implementazione RootViewController.m modificando il codice come segue. Iniziamo dal metodo viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
	
	listaOggetti = [[NSMutableArray alloc] init];
	
	NSArray *arrayAnimali = [NSArray arrayWithObjects:@"Cane", @"Gatto", @"Coniglio", @"Criceto", @"Cavallo", nil];
	NSDictionary *dictAnimali = [NSDictionary dictionaryWithObject:arrayAnimali forKey:@"Elementi"];

	NSArray *arrayOggetti = [NSArray arrayWithObjects:@"Armadio", @"Pentola", @"Ruota", @"iPhone", nil];
	NSDictionary *dictOggetti = [NSDictionary dictionaryWithObject:arrayOggetti forKey:@"Elementi"];
	
	NSArray *arrayNomi = [NSArray arrayWithObjects:@"Mario", @"Nicole", @"Simona", @"Daniel", @"Francesco", nil];
	NSDictionary *dictNomi = [NSDictionary dictionaryWithObject:arrayNomi forKey:@"Elementi"];
	
	[listaOggetti addObject:dictAnimali];
	[listaOggetti addObject:dictOggetti];
	[listaOggetti addObject:dictNomi];	
	
	listaDettaglioOggetti = [[NSMutableArray alloc] init];
	
	NSArray *arrayDettaglioAnimali = [NSArray arrayWithObjects:@"Animale 1", @"Animale 2", @"Animale 3", @"Animale 4", @"Animale 5", nil];
	NSDictionary *dictDettaglioAnimali = [NSDictionary dictionaryWithObject:arrayDettaglioAnimali forKey:@"dettaglioElementi"];
	
	NSArray *arrayDettaglioOggetti = [NSArray arrayWithObjects:@"Oggetto 1", @"Oggetto 2", @"Oggetto 3", @"Oggetto 4", nil];
	NSDictionary *dictDettaglioOggetti = [NSDictionary dictionaryWithObject:arrayDettaglioOggetti forKey:@"dettaglioElementi"];
	
	NSArray *arrayDettaglioNomi = [NSArray arrayWithObjects:@"Nome 1", @"Nome 2", @"Nome 3", @"Nome 4", @"Nome 5", nil];
	NSDictionary *dictDettaglioNomi = [NSDictionary dictionaryWithObject:arrayDettaglioNomi forKey:@"dettaglioElementi"];
	
	[listaDettaglioOggetti addObject:dictDettaglioAnimali];
	[listaDettaglioOggetti addObject:dictDettaglioOggetti];
	[listaDettaglioOggetti addObject:dictDettaglioNomi];
	
	self.navigationItem.title = @"T#020 - TableView in sezioni";
}

In questo modo non facciamo altro che sfruttare gli oggetti NSArray e NSDictionary per memorizzare i nostri dati (con “dettaglio” intendiamo i sottotitoli) che verranno poi mostrati e organizzati a dovere nella nostra tabella. Con l’ultima istruzione “self.navigationItem.title = @”T#020 – TableView in sezioni”;” settiamo semplicemente il titolo mostrato nella barra di navigazione in alto nella view.

Impostiamo il metodo numberOfSectionsInTableView facendo calcolare automaticamente al programma il numero di sezioni della tabella tramite listaOggetti:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [listaOggetti count];
}

Impostiamo quindi il numero di righe nelle sezioni della tabella:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	NSDictionary *dictionary = [listaOggetti objectAtIndex:section];
	NSArray *array = [dictionary objectForKey:@"Elementi"];
	return [array count];
}

Inseriamo ora due metodi che serviranno a mostrare il titolo nell’header e il testo nel footer di ogni sezione:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
	switch (section) {
		case 0:
			return @"Animali";
			break;
		case 1:
			return @"Oggetti";
			break;
		case 2:
			return @"Nomi";
			break;
		default:
			return nil;
			break;
	}
}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
	switch (section) {
		case 0:
			return @"Footer Sezione Animali";
			break;
		case 1:
			return @"Footer Sezione Oggetti";
			break;
		case 2:
			return @"Footer Sezione Nomi";
			break;
		default:
			return nil;
			break;
	}
}

Impostiamo ora l’altezza delle nostre celle tramite il metodo heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
	return 50;
}

Anche se per questo tutorial è totalmente inutile vediamo come impostare un accessorio “tipo” per le tabelle, il DisclosureIndicator (ovvero la “freccettina a destra” utile per indicare all’utente che cliccando su una voce con questo accessorio si aprirà un’altra vista):

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {	
	return UITableViewCellAccessoryDisclosureIndicator;
}

Questo è solo uno degli accessori disponibili, vedremo nei futuri tutorial come impostare gli altri tipi disponibili e come arrivare ad implementare un’eventuale ulteriore vista di dettaglio in base a selezione di una specifica riga della tabella da parte dell’utente.

Vediamo ora il metodo vero e proprio che useremo per riempire la tabella:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
		cell.selectionStyle = UITableViewCellStyleSubtitle;
	}
    
	// Configure the cell.
	
	NSDictionary *dictionary = [listaOggetti objectAtIndex:indexPath.section];
	NSArray *array = [dictionary objectForKey:@"Elementi"];
	NSString *cellValue = [array objectAtIndex:indexPath.row];
	
	NSDictionary *dettaglioDictionary = [listaDettaglioOggetti objectAtIndex:indexPath.section];
	NSArray *dettaglioArray = [dettaglioDictionary objectForKey:@"dettaglioElementi"];
	NSString *dettaglioCellValue = [dettaglioArray objectAtIndex:indexPath.row];
	
	cell.textLabel.text = cellValue;
	cell.detailTextLabel.text = dettaglioCellValue;
	cell.backgroundColor = [UIColor whiteColor];
	cell.selectionStyle = UITableViewCellSelectionStyleBlue;
	
	NSString *nomeImmagine = [NSString stringWithFormat:@"logo.png"];
	[[cell imageView] setImage:[UIImage imageNamed:nomeImmagine]];
	
    return cell;
}

Come vedete abbiamo inizializzato la tabella in modo che la struttura sia quella con i sottotitoli tramite le istruzioni “initWithStyle:UITableViewCellStyleSubtitle” e “cell.selectionStyle = UITableViewCellStyleSubtitle;“.

Dopodichè utilizziamo due oggetti di tipo NSString per memorizzare nel primo i nostri elementi (prelevati da listaOggetti) e nel secondo i rispettivi sottotitoli (presi da listaDettaglioOggetti) che mostreremo poi nella tabella, tramite le proprietà text di textLabel e detailTextLabel delle celle.

Impostiamo quindi il colore di sfondo delle celle e il loro stile durante la selezione (nel nostro caso verranno evidenziate in blu quando l’utente ne selezionerà una).

Le ultime due istruzioni prima di ritornare la nostra cella servono ad inserire un’immagine sulla sinistra. In questo semplice tutorial abbiamo immesso un’unica immagine valida per ogni cella, ma nulla ci vieta di averne una diversa per ogni riga della tabella, vedremo anche questo con uno dei prossimi tutorial.

Come ultima cosa non dimentichiamoci di effettuare un release di listaOggetti e di listaDettaglioOggetti al fine di liberare la memoria utilizzata dal programma nel nostro dispositivo:

- (void)dealloc {
	[listaOggetti release];
	[listaDettaglioOggetti release];
        [super dealloc];
}

Con il codice è tutto, salvate e avviate tramite “Build & Go” l’applicazione nel simulatore o direttamente nel vostro iPhone. Quello che otterrete è qualcosa di simile a quanto mostrato in figura qui sotto. Una tabella divisa per sezioni ti tipo “Plain”, non ancora divisa quindi in raggruppamenti.



Per modificare la struttura della tabella da “Plain” a “Grouped” dobbiamo semplicemente aprire il file “RootViewController.xib” emodificare la proprietà “Styles” negli “Attributes”:


Tutorial 020 - UITable Plain

Si può quindi salvare, chiudere Interface Builder e ricompilare ed eseguire l’applicazione per ottenere questo risultato:


Tutorial 020 - UITable Grouped

Come vedete siamo stati in grado di definire via codice sia elementi relativi all’aspetto grafico della nostra tabella, che ovviamente tutto ciò che concerne i dati rappresentati da essa. Abbiamo usato oggetti diversi, come NSArray, NSDictionary e NSString per il caricamento dei dati nelle tabelle, ovviamente questo è solo un esempio, potevate tranquillamente usare semplici array come potete prelevare dati da un database o da un sito web, con tecniche appena più complesse che vedremo più avanti.

Approfondiremo con i prossimi tutorial altri aspetti legati all’utilissimo e interessantissimo mondo delle tabelle 😉

Share this story:
  • tweet

Tags: Objective-cprogrammazionetable viewTutorial Praticiuitableview

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • Microservizi per logiche applicative di grandi dimensioni

    27 Luglio 2016 - 0 Comment
  • Uno sguardo al runtime Objective-c

    10 Settembre 2013 - 0 Comment
  • Andrea Picchi: Programmare con Objective-C 2.0 per iOS e OS X

    27 Febbraio 2013 - 10 Comments

Author Description

22 Responses to “T#020 – Creiamo Table View raggruppate e divise in sezioni”

  1. 6 Gennaio 2010

    dafo90

    Vedo adesso la guida. Grazie mille!!!!! Questa proprio mi serve!!!! 😉 Complimenti regà!!!! Ora mi metto all’opera 😀

  2. 6 Gennaio 2010

    dafo90

    Mi sorge già una domanda… La mia applicazione ha come “base” del progetto la vista “Tab Bar Controller” e all’interno della prima tab vorrei implementare una tabella simile. Tutto questo codice dove devo metterlo??

  3. 6 Gennaio 2010

    Luigi

    si ovvio che devi metterlo ma devi delegare nel .h in questo modo
    @interface RicetteController : UITableViewController

  4. 6 Gennaio 2010

    dafo90

    In quale file .h??

  5. 7 Gennaio 2010

    Luigi

    crei la tab bar ed inserisci la tabella ( con un navigator tab + table )
    crei un file .h e lo deleghi
    vai nel tab bar e setti come classe quella che hai creato 😀

    Facciamo cosi…vi prometto che faccio una guida su questa cosa 🙂 Che cosi da spiegare è complessa

  6. 8 Gennaio 2010

    Luigi

    La guida sarà a breve disponibile.
    Seguiteci sempre 😀

  7. 11 Febbraio 2010

    schak

    Ottima guida,
    come posso cambiare il colore della categoria degli oggetti? : animali, oggetti etc?
    Inoltre, c’è un modo per poter cambiare il colore dello sfondo ma lasciando sempre qeullo con le righe?

  8. 13 Febbraio 2010

    Danilo

    Ok, semplice semplice… ma come devo fare se ho già un array definito in una classe esterna e voglio passarlo alla RootView?… cioè NON costruirlo dentro viewDidLoad.

  9. 23 Marzo 2010

    tonyangelo

    Fantastica guida!!

    A me servirebbe sapere come collegare altre tableview quando si clicca su una cella 🙂

  10. 27 Marzo 2010

    MacDragon

    Si effettivamente sarebbe bello poter legare a questo tutorial, quello per la creazione delle View dettaglio del record selezionato!!!

  11. 27 Marzo 2010

    Staff devAPP

    Effettivamente manca ancora sulle nostre pagine.. ora creo una sezione sul forum dove potrete richiedere i vostri tutorial.. e noi dello staff… pian piano.. vedremo di farveli tutti.. le richieste sono davvero tante.. cercheremo in ogni caso a farvi avere tutto il materiale che chiedete 😉

  12. 27 Marzo 2010

    Staff devAPP

    Sezione “Richiesta nuovi tutorials” creata nel nostro forum 😉

    http://www.devapp.it/wordpress/forum/richiesta-nuovi-tutorials

  13. 29 Marzo 2010

    dedo93

    Potreste postare il file del progetto xcode? Grazie.

  14. 9 Aprile 2010

    MatteoApple

    Questo è proprio quello che mi serviva!!!

  15. 9 Aprile 2010

    MatteoApple

    MatteoApple :

    Questo è proprio quello che mi serviva!!!

    Inserisci qui il tuo commento

  16. 14 Aprile 2010

    Stefano

    Funziona tutto alla stragrande tranne che per una cosa:
    lo stile grouped non c’è verso che me lo visualizzi.
    Continua a mostrarmi lo stile plain (nel simulatore).
    Premetto che ho modificato gli array in base alle mie esigenze ma, ripeto tutto il rsto funziona alla grance.

  17. 13 Settembre 2010

    Carlo

    ottima guida, fatta molto bene! pero io ho una curiosità, se dovessi per caso dovessi fare una cosa del genre: clik su “Gatto”(per esempio) ed uscire una nuova tableview con la lista dei colori dei gatti(bianco rosso nero ecc.) in questo caso, come dovrei fare?

  18. 7 Aprile 2011

    fast

    ma i delegati come li gestisci??
    perchè tramite

    – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    }

    esegue la stessa azione x ogni cella di diversi header

  19. 12 Luglio 2011

    Antonio

    Bellissimissima e complimenti per i tanti tutorials.
    La mia, e non solo, necessita ora sarebbe quella di aprire una scheda finale per inserire un bel po di informazioni.
    Ad esempio:
    ANIMALI > CANI > RAZZE > COLORE > CANE 1 E SCHEDA SUE CARATTERISTICHE.
    Sembra che ormai il grosso è fatto, come terminare?
    e poi visto le tante schede bisogna creare anche una sorte di DB, che sia SQLite o Data Core ditemi voi quale consigliabile, per l’inserimento delle informazioni da mostrare nelle schede.
    Per finire poi vorrei aggiungere la possibilità di leggere un xml da server per l’aggiornamento/aggiunta delle schede, ma per questo ho già visto che c’è un altro tutorial.
    Grazie mille e ancora complimenti .
    A.

  20. 21 Luglio 2011

    iStopped

    Ma se volessi mostrare il contenuto di una plist? Con dentro un array chiamato Networks

  21. 20 Agosto 2011

    Matteo

    Salve, ma se volessi che ogni cella avesse un immagine diversa? grazie….

  22. 17 Novembre 2013

    Francesco

    Salve a tutti, se io volessi cambiare la grafica di come viene visualizzata la lista come dovrei fare?

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO