Curs de programació d ’ iOS

33
Curs de programació d’iOS Novembre de 2011 Organitza

description

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 . - PowerPoint PPT Presentation

Transcript of Curs de programació d ’ iOS

Page 1: Curs de programació d ’ iOS

Curs de programació d’iOSNovembre de 2011

Organitza

Page 2: Curs de programació d ’ iOS

8 Llistes (UITableView i UITableViewController)

• Les llistes interactives permeten als usuaris seleccionar, eliminar i reordenar elements.

• S’empren en la gran majoria d’aplicacions.

• Els elements es desplacen verticalment tal i com ho farien amb un UIScrollView

Page 3: Curs de programació d ’ iOS

Llistes

• Hi ha diferents tipus de llistes

Page 4: Curs de programació d ’ iOS

Llistes• Taules planes (plain table view)

Page 5: Curs de programació d ’ iOS

• Taula agrupada (grouped table view)

Llistes

Page 6: Curs de programació d ’ iOS

• Taula plana indexada (plain with section index)

Llistes

Page 7: Curs de programació d ’ iOS

Llistes

• Per treballar amb una llista cal implementar un controlador i la seva vista:

• Un controlador UITableViewController

• Una vista UITableView

Page 8: Curs de programació d ’ iOS

Llistes

• Un UITableView és una subclasse de UIScrollView, de la qual n’hereta la capacitat de fer scroll i l’efecte motlla “bouncy”.

• La vista UITableView representa gràficament una llista.

• Cada filera de la llista s’anomena cel·la.

• Les cel·les són vistes del tipus UITableViewCell

Page 9: Curs de programació d ’ iOS

Llistes

• Les llistes es poden agrupar. Com a mínim tenen un grup.• Cada grup (section) consta d’un conjunt de cel·les.• Els grups tenen una capçalera.

Page 10: Curs de programació d ’ iOS

UITableView

• Un UITableView és una vista; per tant, d’acord amb el patró Model-Vista-Controlador, només te representació visual però no es capaç de gestionar ni la lògica ni les dades.

• UITableView necessita un delegate que implementi el protocol UITableViewDelegate per notificar de qualsevol acció sobre la vista.

• UITableView necessita un delegate que implementi el protocol UITableViewDataSource que actui com a origen de dades.

Page 11: Curs de programació d ’ iOS

UITableViewController

• Un UITableViewController és una classe que pot dur a terme totes les funcions mencionades:

• Controlador de la vista UITableView• Delegate de UITableViewDelegate• Delegate de UITableViewDataSource

UITableViewDataSource UITableViewDelegate

s’ajusta as’ajusta a

UITableViewController delegate

tableView

dataSource

UITableView

Page 12: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

#import <UIKit/UIKit.h>

@interface CatalegTableViewController : UItableViewController {

NSMutableArray *cotxes_familiars;}

- (void)inicialitzarDades;

@end

• CatalegTableViewController.h

Page 13: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

#import “CatalegTableViewController.h”#import “Cotxe.h”

@implementation CatalegTableViewController

- (void)inicialitzarDades{

cotxes_familiars = [[Cotxe obtenirCotxesFamiliars] retain];}

- (void)dealloc{

[cotxes_familiars release];[super dealloc];

}

@end

• CatalegTableViewController.m

Page 14: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

Page 15: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

Page 16: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

Page 17: Curs de programació d ’ iOS

Protocol UITableViewDataSource

• Ara CatalegTableViewController emmagatzema objectes de tipus Cotxe.

• Mitjançant el protocol UITableViewDataSource el UITableView solicitarà aquestes dates a mostrar.

• http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITableViewDataSource_Protocol/Reference/Reference.html

Page 18: Curs de programació d ’ iOS

Protocol UITableViewDataSource

• Aquest protocol defineix un conjunt de mètodes que hem d’implementar. De tots els mètodes n’hi ha dos que s’han d’implementar obligatòriament:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Retornem el número de cel·les de les seccions (grups)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Retornem la cel·la que cal mostrar a una determinada filera

Page 20: Curs de programació d ’ iOS

Exemple 8 – Catàleg simple de cotxes

#import “CatalegTableViewController.h”#import “Cotxe.h”

@implementation CatalegTableViewController

- (void)inicialitzarDades{

cotxes_familiars = [[Cotxe obtenirCotxesFamiliars] retain];}

- (void)dealloc{

[cotxes_familiars release];[super dealloc];

}

• CatalegTableViewController.m

Page 21: Curs de programació d ’ iOS

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return [cotxes_familiars count];}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@”UITableViewCell”] autorelease];

Cotxe *cotxe = [cotxes_familiars objectAtIndex:[indexPath row]];[[cell textLabel] setText:[cotxe marca]];[[cell detailTextLabel] setText:[cotxe model]];[[cell imageView] setImage:[UIImage imageNamed:[cotxe foto]]];

return cell;}

@end

tableView:numberOfRowsInSections

UITableView NSMutableArray

CatalegTableViewController

dataSource

cotxes_familiars

count

Page 22: Curs de programació d ’ iOS

tableView:cellForRowAtIndexPath:

UITableView NSMutableArray

CatalegTableViewController

dataSource

cotxes_familiars

objectAtIndex:

Cotxe

Cotxe

Cotxe

0

1

2

UITableViewCell

UITableViewCell

UITableViewCell

0

1

2

Page 23: Curs de programació d ’ iOS

UITableViewCell

• Un UITableViewCell és una subclasse de UIView, i cada fila d’una vista UITableView està representada per una instància de UITableViewCell

• Un UITableViewCell està compost per dos vistes:

• contentView: S’hi mostren les dades.

• accessoryView: S’hi mostra l’accessori.

Page 24: Curs de programació d ’ iOS

UITableViewCell

UITableViewCell contentView(Vista de continguts)

accessoryView(Vista accessori)

Vista dels continguts de la cel·la

Page 25: Curs de programació d ’ iOS

UITableViewCell

• Tipus de cel·les estàndar de l’SDK:

Page 26: Curs de programació d ’ iOS

UITableViewCell

• Tipus d’accessoris estàndar de l’SDK:

• UITableViewCellAccessoryDisclosureIndicator

• UITableViewCellAccessoryDetailDisclosureButton

• UITableViewCellAccessoryCheckmark

• UITableViewCellAccessoryNone

cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@“imatge.png" ]];

• Accessori customitzat:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

Page 27: Curs de programació d ’ iOS

Reutilització de cel·les

• L’iPhone te una quantitat limitada de memòria. No és recomanable carregar en memòria moltes cel·les.

• Només és necessari carregar en memòria les cel·les que l’usuari veu. Les que estan fora de l’àrea de visió no cal tenir-les en memòria i s’alliberen.

• Reutilitzant dinàmicament les cel·les evitarem colapsar la memòria del dispositiu.

Page 28: Curs de programació d ’ iOS

Reutilització de cel·les

• Quan l’usuari es mou per la llista, algunes cel·les surten de la pantalla i van a parar a un dipòsit (caché) de cel·les disponibles per a la seva reutilització.

• Enlloc de crear una nova cel·la cada vegada, l’origen de dades comprova en primer lloc si hi ha cel·les disponibles al dipòsit.

Page 29: Curs de programació d ’ iOS

Reutilització de cel·les

UITableViewCell 2

UITableViewCell 3

UITableViewCell 4

UITableViewCell 1

UITableViewCell 1La cel·la Cell 1

surt de la pantalla...

L’usuari mou la llistaen aquesta direcció

...i és reintroduïdanovament

Porció visiblede l’UITableView

Page 30: Curs de programació d ’ iOS

Reutilització de cel·les

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@”UITableViewCell”] autorelease];

Cotxe *cotxe = [cotxes_familiars objectAtIndex:[indexPath row]];[[cell textLabel] setText:[cotxe marca]];[[cell detailTextLabel] setText:[cotxe model]];

return cell;}

Page 31: Curs de programació d ’ iOS

Subclasses de UITableViewCell• Podem implementar subclasses de UITableViewCell per

dissenyar les nostres propies cel·les totalment a mida.

Page 32: Curs de programació d ’ iOS

Exemple 9 – Catàleg de cotxes

#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

• CotxeTableViewCell.h

Page 33: Curs de programació d ’ iOS

Exemple 9 – Catàleg de cotxes

#import “CotxeTableViewCell.h"

@implementation CotxeTableViewCell

- (void)layoutSubviews {

if (self.editing) return;

[super layoutSubviews];CGRect contentRect = self.contentView.bounds;

CGRect frame = CGRectMake(90, 5, 200, 17);self.categoria.backgroundColor = [UIColor clearColor];self.categoria.frame = frame;

//Mostrar el titular de l'articleframe = CGRectMake(90, 23, 200, 44);self.titular.backgroundColor = [UIColor clearColor];self.titular.frame = frame;

//Es fa rotar l'indicador[self startRotate];

self.editing = true;}

@end

• CotxeTableViewCell.m