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. Les vistes, o instancies view, que apareixen a la pantalla pertanyen al UIViewController situat a la part més alta de la pila.
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 rootViewControllerviewControllers 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ó
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 UIViewControllerUINavigationBar UIView topViewControllernavigationBar view
Exemple 10 #import “CotxesAppDelegate.h" #import window = viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.viewController = [[[LlistaViewController alloc] bundle:nil] autorelease]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; self.window.rootViewController = navController; [navController release]; [self.window makeKeyAndVisible]; return YES;
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.
navigationBar UINavigationController topViewController UINavigationBar navigationItem UIViewControllerUINavigationItem Obté les dades que ha de mostrar a partir de...
UINavigationBar topViewController UNavigationController navigationBar UIViewController UINavigationItem navigationItem title
UINavigationBar navigationBar UINavigationController topViewController UIViewController navigationItem UINavigationItem UIBarButtonItem leftBarButtonItemrightBarButtonItemtitleView UILabelUIBarButtonItem title text 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 NSURLConnection request NSURLRequest URL NSURL cachePolicy Timeout httpHeaders httpBody
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 web NSURL *url = [NSURL // Composar el request NSURLRequest *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]; = 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 anterior NSXMLParser *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 { 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 { trobat.”); [object setTitle:titleString]; [titleString release]; titleString = nil; } Mètode per processar els tags de tancament parser:didEndElement:nameSpaceURI:qualifiedName