280 likes | 423 Views
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 .
E N D
Curs de programació d’iOS Novembre de 2011 Organitza
9Navegació(UINavigationController) • Les aplicacions que tenen múltiples pantallesd’informacióutilitzen la classeUINavigationController • UINavigationControllerésl’encarregat de mantenir una pila de pantalles. • Les vistes, o instancies view, que apareixena la pantalla pertanyen al UIViewControllersituat a la partmés alta de la pila.
Navegació • Quans’inicialitza una instància de UINavigationController se li ha d’especificar un UIViewControllerarrel. • El UIViewControllerarrelmostra la primera pantalla que l’usuariveu.
Navegació UINavigationController rootViewController viewControllers topViewController NSArray UIViewController UIViewController
Navegació • Quan la pila rep una operació de tipuspushViewController, s’afegeix un nou controlador a la posiciómés alta de la pila i es mostra per pantalla la sevacorresponent vista.
Navegació(pushViewController) [[self navigationController] pushViewController:viewControlleranimated:YES];
Navegació • Quan la pila rep una operació de tipuspopViewController, 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ó • UINavigationControllerté almenysduesvistes: • La vista del UIViewControllersituat a la partmés alta de la pila, ésa dir, el que s’estàmostrant. • Un UINavigationBar (barra superior de navegació)
Navegació UINavigationController topViewController navigationBar view UIViewController UINavigationBar view UIView
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 = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease]; self.viewController= [[[LlistaViewControlleralloc] initWithNibName:@"LlistaViewController" bundle:nil] autorelease]; UINavigationController *navController = [[UINavigationControlleralloc] initWithRootViewController:self.viewController]; self.window.rootViewController= navController; [navController release]; [self.windowmakeKeyAndVisible]; returnYES; }@end
UINavigationBar • UINavigationBarés la classeencarregada de representar la barra de navegació. • La classeUINavigationItemésl’encarregada de proporcionar a la barra de navegació el contingut que ha de mostrar. • ElscontroladorsUIViewControllertenen la propietatnavigationItem del tipusUINavigationItem • Quans’empilaun UIViewController, el controlador de navegacióUINavigationBarutilitza la propietatnavigationItem per obtenir el contingut a mostrar.
UINavigationBar navigationBar UINavigationController UINavigationBar Obté les dades que ha de mostrar a partir de... topViewController navigationItem UIViewController UINavigationItem
UINavigationBar topViewController UNavigationController UIViewController navigationBar navigationItem UINavigationItem title = @”MyApp”
UINavigationBar navigationBar UINavigationController topViewController UIViewController UINavigationItem navigationItem leftBarButtonItem titleView rightBarButtonItem UIBarButtonItem UILabel UIBarButtonItem text = @”New Message” title = @”Cancel” title = @”Send”
10 Interaccióambserveis web • Un servei web és una aplicació que corre sobre un servidor web. • Permetenl’intercanvid’informació entre el terminal i el servidor. • El formatmés habitual de les dades que es transfereixen entre un servei web i una aplicacióclientés XML i JSON.
Obtenirdades des d’una URL • Disposem de tres classes: NSURL, NSURLRequest i NSURLConnection NSURLRequest NSURLConnection NSURL cachePolicy Timeout httpHeaders httpBody URL request http://www.google.com
Obtenirdades des d’una URL • NSURL: Conté l’adreça URL de l’aplicació web. • NSURLRequest: Les instànciesd’aquestaclasseemmagatzemen totes les dadesnecessàries per a la comunicacióamb el servidor web. Configuració de la caché, tempsmàxim de resposta, capçaleres http, etc… • NSURLConnection: Les instànciesd’aquestaclassesón les responsables de portar a terme la connexióamb el servidor web, enviar i rebre la informació.
Comtreballaramb la classeNSURLConnection • Es potconnectar a un servidor web de duesmaneres: en modesíncron o modeasíncron. • El modesíncronbloquejal’aplicaciómentre no es reben les dadescompletament. • El modeasíncronno paralitza la l’aplicaciódurant les transferències. Elscallbackss’invoquen sobre la classedelegadora que implementa NSURLConnectionDelegate
Exemple de connexió asíncrona • Crea la connexió a un RSS // Composar la URL del servei web NSURL *url = [NSURL URLWithString:@” http://www.elpais.com/rss/”]; // Composar el request NSURLRequest *request = [NSURLRequestrequestWithURL:urlcachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; if(connectionInProgress) { [connectionInProgress cancel]; [connectionInProgress release]; } xmlData = [[NSMutableDataalloc] init]; // S’inicia la connexióasíncrona (no-bloquejant) connectionInProgress = [[NSURLConnectionalloc] initWithRequest:requestdelegate:selfstartImmediately:YES];
Exemple de connexió asíncrona • Implementar elsmètodesdelegats de NSURLConnectionDelegate • Concatenar les dades que es van rebent. // Composar la URL del servei web // Aquestmètodeseràinvocat varies vegades a mesuraquevaginarribantels fragments de dades - (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data { [xmlDataappendData:data]; } • Quan la connexió acaba d’obtenir totes les dadess’invoca el mètodeconnectionDidFinishLoading al delegat. - (void)connectionDidFinishLoading: (NSURLConnection *)connection { NSString *xmlCheck = [[[NSStringalloc] initWithData:xmlData encoding:NSUTF8StringEncoding] autorelease]; NSLog(@”xmlCheck = %@”, xmlCheck); }
Exemple de connexió asíncrona • Hi ha la possibilitat de que la connexiófalli. En aquests casos s’invoca el mètodeconnection:didFailWithError - (void)connection: (NSURLConnection *)connection didFailWithError: (NSError *)error { [connectionInProgress release]; connectionInProgress = nil; [xmlData release]; xmlData = nil; }
Anàlisis de dades XML • Per processar les dades XML que s’obtenend’unservei web cal emprar un parser XML. • Per a aquesta tasca disposem de la classeNSXMLParser • A mesura que el parseravançaamb la lectura de dades, aniràenviantmissatges al seudelegat de tipusNSXMLParserDelegate el quall’informarà del progrés. • Parser de tipusSAX
NSXMLParser // Crearl’objecte parser ambdadesrebudes del servei web anterior NSXMLParser *parser = [[NSXMLParseralloc] initWithData:xmlData]; // Cal assignar-li el delegate de tipusNSXMLParserDelegate [parser setDelegate: self]; // Iniciar el parseig. El document XML seràanalitzat I formatejat, i el delegate de NSXMLParserrebrà tots elsseusmissatges // delegatsabans de quefinalitzil’execuciód’aquestalinia (bloquejant) [parser parse]; // En aquest punt el parser ha finalitzatija el podemalliberar [parser release]; // Podemrefrescar les dades de la taula [[self tableView] reloadData];
NSXMLParser • Implementaciódelsmètodesdelegats de NSXMLParserDelegate • Mètode per processarelstagsd’inici o obertura parser:didStartElement:nameSpaceURI:qualifiedName:attributes - (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementNamenamespaceURI : (NSString *)namespaceURIqualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict { if([elementNameisEqual:@”title”]) { NSLog(@”TAG <title> trobat.”); titleString = [[NSMutableStringalloc] init]; } } • Concatenar el text que hi ha entre tag i tag. - (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string { [titleStringappendString:string]; }
NSXMLParser • Mètode per processarelstagsde tancamentparser:didEndElement:nameSpaceURI:qualifiedName - (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementNamenamespaceURI : (NSString *)namespaceURIqualifiedName: (NSString *)qName { if([elementNameisEqual:@”title”]) { NSLog(@”TAG </title> trobat.”); [object setTitle:titleString]; [titleString release]; titleString = nil; } }