Curs de programació d ’ iOS

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

description

Curs de programació d ’ iOS. Novembre de 2011. Organitza. 9 Navegació ( UINavigationController ). Les aplicacions que tenen múltiples pantalles d’informació utilitzen la classe UINavigationController UINavigationController és l’encarregat de mantenir una pila de pantalles . - 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

9 Navegació (UINavigationController)

• Les aplicacions que tenen múltiples pantalles d’informació utilitzen la classe UINavigationController

• UINavigationController és l’encarregat de mantenir una pila de pantalles.

• Les vistes, o instancies view, que apareixen a la pantalla pertanyen al UIViewController situat a la part més alta de la pila.

Page 3: Curs de programació d ’ iOS

Navegació

Page 4: Curs de programació d ’ iOS

Navegació

• Quan s’inicialitza una instància de UINavigationController se li ha d’especificar un UIViewController arrel.

• El UIViewController arrel mostra la primera pantalla que l’usuari veu.

Page 5: Curs de programació d ’ iOS

NavegacióUINavigationController

topViewController

NSArray

rootViewController viewControllers

UIViewController UIViewController

Page 6: Curs de programació d ’ iOS

Navegació• Quan la pila rep una operació de tipus pushViewController,

s’afegeix un nou controlador a la posició més alta de la pila i es mostra per pantalla la seva corresponent vista.

Page 7: Curs de programació d ’ iOS

Navegació (pushViewController)

[[self navigationController] pushViewController:viewController animated:YES];

Page 8: Curs de programació d ’ iOS

Navegació• Quan la pila rep una operació de tipus popViewController,

s’extreu el controlador situat a la posició més alta (pantalla visible) de la pila i es torna a mostrar la pantalla del controlador anterior.

Page 9: Curs de programació d ’ iOS

Navegació (popViewController)

[[self navigationController] popViewControllerAnimated:YES];

Page 10: Curs de programació d ’ iOS

Navegació

Page 11: Curs de programació d ’ iOS

Navegació

• UINavigationController té almenys dues vistes:

• La vista del UIViewController situat a la part més alta de la pila, és a dir, el que s’està mostrant.

• Un UINavigationBar (barra superior de navegació)

Page 12: Curs de programació d ’ iOS

NavegacióUINavigationController

UIViewController UINavigationBar

UIView

topViewController navigationBarview

view

Page 13: Curs de programació d ’ iOS

Exemple 10#import “CotxesAppDelegate.h"#import “CatalegViewController.h"

@implementation CotxesAppDelegate

@synthesize window = _window;@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

self.viewController = [[[LlistaViewController alloc] initWithNibName:@"LlistaViewController" bundle:nil] autorelease];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];

self.window.rootViewController = navController;[navController release];[self.window makeKeyAndVisible];

return YES;}@end

Page 14: Curs de programació d ’ iOS

UINavigationBar

• UINavigationBar és la classe encarregada de representar la barra de navegació.

• La classe UINavigationItem és l’encarregada de proporcionar a la barra de navegació el contingut que ha de mostrar.

• Els controladors UIViewController tenen la propietat navigationItem del tipus UINavigationItem

• Quan s’empila un UIViewController, el controlador de navegació UINavigationBar utilitza la propietat navigationItem per obtenir el contingut a mostrar.

Page 15: Curs de programació d ’ iOS

navigationBarUINavigationController

topViewController

UINavigationBar

UINavigationBar

navigationItemUIViewController UINavigationItem

Obté les dades que hade mostrar a partir de...

Page 16: Curs de programació d ’ iOS

UINavigationBar

topViewControllerUNavigationController

navigationBar

UIViewController

UINavigationItem

navigationItem

title = @”MyApp”

Page 17: Curs de programació d ’ iOS

UINavigationBar

navigationBarUINavigationController

topViewController

UIViewControllernavigationItem

UINavigationItem

UIBarButtonItem

leftBarButtonItem rightBarButtonItemtitleView

UILabel UIBarButtonItem

title = @”Cancel” title = @”Send”text = @”New Message”

Page 18: Curs de programació d ’ iOS

10 Interacció amb serveis web

• Un servei web és una aplicació que corre sobre un servidor web.

• Permeten l’intercanvi d’informació entre el terminal i el servidor.

• El format més habitual de les dades que es transfereixen entre un servei web i una aplicació client és XML i JSON.

Page 19: Curs de programació d ’ iOS

Obtenir dades des d’una URL

• Disposem de tres classes: NSURL, NSURLRequest i NSURLConnection

NSURLConnectionrequest

NSURLRequest

URLNSURLcachePolicy

TimeouthttpHeaders

httpBody

http://www.google.com

Page 20: Curs de programació d ’ iOS

Obtenir dades des d’una URL

• NSURL: Conté l’adreça URL de l’aplicació web.

• NSURLRequest: Les instàncies d’aquesta classe emmagatzemen totes les dades necessàries per a la comunicació amb el servidor web. Configuració de la caché, temps màxim de resposta, capçaleres http, etc…

• NSURLConnection: Les instàncies d’aquesta classe són les responsables de portar a terme la connexió amb el servidor web, enviar i rebre la informació.

Page 21: Curs de programació d ’ iOS

Com treballar amb la classe NSURLConnection

• Es pot connectar a un servidor web de dues maneres: en mode síncron o mode asíncron.

• El mode síncron bloqueja l’aplicació mentre no es reben les dades completament.

• El mode asíncron no paralitza la l’aplicació durant les transferències. Els callbacks s’invoquen sobre la classe delegadora que implementa NSURLConnectionDelegate

Page 22: Curs de programació d ’ iOS

Exemple de connexió asíncrona

// Composar la URL del servei webNSURL *url = [NSURL URLWithString:@” http://www.elpais.com/rss/”];

// Composar el requestNSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

if(connectionInProgress){

[connectionInProgress cancel];[connectionInProgress release];

}

xmlData = [[NSMutableData alloc] init];

// S’inicia la connexió asíncrona (no-bloquejant)connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

• Crea la connexió a un RSS

Page 23: Curs de programació d ’ iOS

Exemple de connexió asíncrona

// Composar la URL del servei web// Aquest mètode serà invocat varies vegades a mesura que vagin arribant els fragments de dades

- (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data{

[xmlData appendData:data];}

• Implementar els mètodes delegats de NSURLConnectionDelegate

• Concatenar les dades que es van rebent.

- (void)connectionDidFinishLoading: (NSURLConnection *)connection{

NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding] autorelease];NSLog(@”xmlCheck = %@”, xmlCheck);

}

• Quan la connexió acaba d’obtenir totes les dades s’invoca el mètode connectionDidFinishLoading al delegat.

Page 24: Curs de programació d ’ iOS

Exemple de connexió asíncrona

- (void)connection: (NSURLConnection *)connection didFailWithError: (NSError *)error{

[connectionInProgress release];connectionInProgress = nil;

[xmlData release];xmlData = nil;

}

• Hi ha la possibilitat de que la connexió falli. En aquests casos s’invoca el mètode connection:didFailWithError

Page 25: Curs de programació d ’ iOS

Anàlisis de dades XML

• Per processar les dades XML que s’obtenen d’un servei web cal emprar un parser XML.

• Per a aquesta tasca disposem de la classe NSXMLParser

• A mesura que el parser avança amb la lectura de dades, anirà enviant missatges al seu delegat de tipus NSXMLParserDelegate el qual l’informarà del progrés.

• Parser de tipus SAX

Page 26: Curs de programació d ’ iOS

NSXMLParser

// Crear l’objecte parser amb dades rebudes del servei web anteriorNSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];

// Cal assignar-li el delegate de tipus NSXMLParserDelegate[parser setDelegate: self];

// Iniciar el parseig. El document XML serà analitzat I formatejat, i el delegate de NSXMLParser rebrà tots els seus missatges// delegats abans de que finalitzi l’execució d’aquesta linia (bloquejant)[parser parse];

// En aquest punt el parser ha finalitzat i ja el podem alliberar[parser release];

// Podem refrescar les dades de la taula[[self tableView] reloadData];

Page 27: Curs de programació d ’ iOS

NSXMLParser

- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI : (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict{

if([elementName isEqual:@”title”]){

NSLog(@”TAG <title> trobat.”);titleString = [[NSMutableString alloc] init];

}}

• Implementació dels mètodes delegats de NSXMLParserDelegate

• Mètode per processar els tags d’inici o obertura parser:didStartElement:nameSpaceURI:qualifiedName:attributes

• Concatenar el text que hi ha entre tag i tag.

- (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string{

[titleString appendString:string];}

Page 28: Curs de programació d ’ iOS

NSXMLParser

- (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI : (NSString *)namespaceURI qualifiedName: (NSString *)qName{

if([elementName isEqual:@”title”]){

NSLog(@”TAG </title> trobat.”);[object setTitle:titleString];

[titleString release];titleString = nil;

}}

• Mètode per processar els tags de tancament parser:didEndElement:nameSpaceURI:qualifiedName