330 likes | 443 Views
Curs de programació d ’ iOS. Novembre de 2011. Organitza. 8 Llistes ( UITableView i UITableViewController ). Les llistes interactives permeten als usuaris seleccionar, eliminar i reordenar elements . S’empren en la gran majoria d’aplicacions .
E N D
Curs de programació d’iOS Novembre de 2011 Organitza
8Llistes(UITableView i UITableViewController) • Les llistesinteractivespermetenalsusuaris seleccionar, eliminar i reordenar elements. • S’empren en la gran majoriad’aplicacions. • Elselements es desplacen verticalment tal i comhofarienamb un UIScrollView
Llistes • Hi ha diferentstipus de llistes
Llistes • Taules planes (plaintableview)
Llistes • Taula agrupada (groupedtableview)
Llistes • Taula plana indexada (plainwithsectionindex)
Llistes • Per treballaramb una llista cal implementar un controlador i la seva vista: • Un controlador UITableViewController • Una vista UITableView
Llistes • Un UITableViewés una subclasse de UIScrollView, de la qualn’hereta la capacitat de ferscroll i l’efectemotlla“bouncy”. • La vista UITableViewrepresenta gràficament una llista. • Cada filera de la llistas’anomenacel·la. • Les cel·lessón vistes del tipusUITableViewCell
Llistes • Les llistes es poden agrupar. Com a mínimtenen un grup. • Cada grup (section) consta d’unconjunt de cel·les. • Elsgrupstenen una capçalera.
UITableView • Un UITableViewés una vista; per tant, d’acordamb el patróModel-Vista-Controlador, només te representació visual però no es capaç de gestionar ni la lògica ni les dades. • UITableViewnecessita un delegate que implementi el protocolUITableViewDelegate per notificar de qualsevolacció sobre la vista. • UITableViewnecessita un delegate que implementi el protocolUITableViewDataSource que actuicom a origen de dades.
UITableViewController • Un UITableViewControllerés una classe que potdur a terme totes les funcionsmencionades: • Controlador de la vista UITableView • Delegate de UITableViewDelegate • Delegate de UITableViewDataSource UITableViewDataSource UITableViewDelegate s’ajusta a s’ajusta a delegate UITableViewController UITableView tableView dataSource
Exemple 8 – Catàleg simple de cotxes • CatalegTableViewController.h #import <UIKit/UIKit.h> @interface CatalegTableViewController : UItableViewController { NSMutableArray *cotxes_familiars; } - (void)inicialitzarDades; @end
Exemple 8 – Catàleg simple de cotxes • CatalegTableViewController.m #import “CatalegTableViewController.h” #import “Cotxe.h” @implementation CatalegTableViewController - (void)inicialitzarDades { cotxes_familiars= [[CotxeobtenirCotxesFamiliars] retain]; } - (void)dealloc { [cotxes_familiars release]; [super dealloc]; } @end
ProtocolUITableViewDataSource • Ara CatalegTableViewControlleremmagatzemaobjectes de tipusCotxe. • Mitjançant el protocolUITableViewDataSource el UITableViewsolicitaràaquestes dates a mostrar. • http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITableViewDataSource_Protocol/Reference/Reference.html
ProtocolUITableViewDataSource • Aquestprotocoldefineix un conjunt de mètodes que hemd’implementar. De totselsmètodesn’hi ha dos que s’hand’implementarobligatòriament: • - (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section Retornem el número de cel·les de les seccions (grups) • - (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath Retornem la cel·la que cal mostrar a una determinada filera
ProtocolUITableViewDataSource • Defineixaltresmètodes no menysimportants. • - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView Retornem el número de seccions (grups) • - (NSString *)tableView:(UITableView *)tableViewtitleForHeaderInSection:(NSInteger)section Retornem el títol de la secció especificada • - (NSString *)tableView:(UITableView *)tableViewtitleForFooterInSection:(NSInteger)section Retornem el peu de la secció especificada
Exemple 8 – Catàleg simple de cotxes • CatalegTableViewController.m #import “CatalegTableViewController.h” #import “Cotxe.h” @implementation CatalegTableViewController - (void)inicialitzarDades { cotxes_familiars = [[CotxeobtenirCotxesFamiliars] retain]; } - (void)dealloc { [cotxes_familiars release]; [super dealloc]; }
- (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section { return [cotxes_familiars count]; } - (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:@”UITableViewCell”] autorelease]; Cotxe *cotxe = [cotxes_familiarsobjectAtIndex:[indexPath row]]; [[cell textLabel] setText:[cotxemarca]]; [[cell detailTextLabel] setText:[cotxe model]]; [[cell imageView] setImage:[UIImageimageNamed:[cotxefoto]]]; return cell; } @end CatalegTableViewController tableView:numberOfRowsInSections count dataSource cotxes_familiars UITableView NSMutableArray
CatalegTableViewController tableView:cellForRowAtIndexPath: objectAtIndex: dataSource cotxes_familiars UITableView NSMutableArray 0 0 UITableViewCell Cotxe 1 1 2 2 UITableViewCell Cotxe UITableViewCell Cotxe
UITableViewCell • Un UITableViewCellés una subclasse de UIView, i cada fila d’una vista UITableViewestà representada per una instància de UITableViewCell • Un UITableViewCellestà compost per dos vistes: • contentView: S’himostren les dades. • accessoryView: S’himostral’accessori.
UITableViewCell contentView (Vista de continguts) accessoryView (Vista accessori) UITableViewCell Vista dels continguts de la cel·la
UITableViewCell • Tipus de cel·lesestàndar de l’SDK:
UITableViewCell • Tipusd’accessorisestàndar de l’SDK: • UITableViewCellAccessoryDisclosureIndicator • UITableViewCellAccessoryDetailDisclosureButton • UITableViewCellAccessoryCheckmark • UITableViewCellAccessoryNone • cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; • Accessoricustomitzat: • cell.accessoryView= [[ UIImageViewalloc ] initWithImage:[UIImageimageNamed:@“imatge.png" ]];
Reutilització de cel·les • L’iPhone te una quantitat limitada de memòria. No ésrecomanablecarregar en memòriamoltescel·les. • Nomésésnecessaricarregar en memòria les cel·les que l’usuariveu. Les que estanfora de l’àrea de visió no cal tenir-les en memòriai s’alliberen. • Reutilitzantdinàmicament les cel·lesevitarem colapsar la memòria del dispositiu.
Reutilització de cel·les • Quanl’usuari es mou per la llista, algunescel·les surten de la pantalla i van a parar a un dipòsit(caché) de cel·les disponibles per a la sevareutilització. • Enlloc de crear una nova cel·la cada vegada, l’origen de dadescomprova en primer lloc si hi ha cel·les disponibles al dipòsit.
Reutilització de cel·les La cel·la Cell 1 surt de la pantalla... UITableViewCell 1 UITableViewCell 2 Porció visible de l’UITableView UITableViewCell 3 L’usuari mou la llista en aquesta direcció UITableViewCell 4 ...i és reintroduïda novament UITableViewCell 1
Reutilització de cel·les - (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:@”UITableViewCell”] autorelease]; Cotxe *cotxe = [cotxes_familiarsobjectAtIndex:[indexPath row]]; [[cell textLabel] setText:[cotxemarca]]; [[cell detailTextLabel] setText:[cotxe model]]; return cell; }
Subclasses de UITableViewCell • Podem implementar subclasses de UITableViewCell per dissenyar les nostrespropiescel·lestotalment a mida.
Exemple 9 – Catàleg de cotxes • CotxeTableViewCell.h #import <UIKit/UIKit.h> #import “Cotxe.h" @interface CotxeTableViewCell: UITableViewCell { UIImageView*marc_thumbnail; UIImageView*thumbnail; UIImageView *background_cella; UIImageView *puntuació; UILabel*etiqueta_marca; UILabel*etiqueta_model; Cotxe *cotxe; } @property (nonatomic, retain) Cotxe*cotxe; - (void)esPaginador:(bool)p; @end
Exemple 9 – Catàleg de cotxes • CotxeTableViewCell.m #import “CotxeTableViewCell.h" @implementation CotxeTableViewCell - (void)layoutSubviews { if (self.editing) return; [superlayoutSubviews]; CGRectcontentRect = self.contentView.bounds; CGRectframe= CGRectMake(90, 5, 200, 17); self.categoria.backgroundColor= [UIColorclearColor]; self.categoria.frame= frame; //Mostrar el titular de l'article frame = CGRectMake(90, 23, 200, 44); self.titular.backgroundColor= [UIColorclearColor]; self.titular.frame= frame; //Es fa rotar l'indicador [self startRotate]; self.editing= true; } @end