Curs de programació d’iOS Novembre de 2011 Organitza.
-
Upload
monica-bustamante-correa -
Category
Documents
-
view
218 -
download
0
Transcript of Curs de programació d’iOS Novembre de 2011 Organitza.
Curs de programació d’iOSNovembre 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.
• Les vistes, o instancies view, que apareixen a la pantalla pertanyen al UIViewController situat a la part més alta de la pila.
Navegació
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.
NavegacióUINavigationController
topViewController
NSArray
rootViewController viewControllers
UIViewController UIViewController
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.
Navegació (pushViewController)
[[self navigationController] pushViewController:viewController animated:YES];
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.
Navegació (popViewController)
[[self navigationController] popViewControllerAnimated:YES];
Navegació
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ó)
NavegacióUINavigationController
UIViewController UINavigationBar
UIView
topViewController navigationBarview
view
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
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.
navigationBarUINavigationController
topViewController
UINavigationBar
UINavigationBar
navigationItemUIViewController UINavigationItem
Obté les dades que hade mostrar a partir de...
UINavigationBar
topViewControllerUNavigationController
navigationBar
UIViewController
UINavigationItem
navigationItem
title = @”MyApp”
UINavigationBar
navigationBarUINavigationController
topViewController
UIViewControllernavigationItem
UINavigationItem
UIBarButtonItem
leftBarButtonItem rightBarButtonItemtitleView
UILabel UIBarButtonItem
title = @”Cancel” title = @”Send”text = @”New Message”
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.
Obtenir dades des d’una URL
• Disposem de tres classes: NSURL, NSURLRequest i NSURLConnection
NSURLConnectionrequest
NSURLRequest
URLNSURLcachePolicy
TimeouthttpHeaders
httpBody
http://www.google.com
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ó.
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
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
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.
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
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
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];
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];}
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