Dé­ve­lop­per une ap­pli­ca­tion iOS af­fi­chant des flux RSS

Nous al­lons voir la troi­sième et der­nière par­tie de notre ap­pli­ca­tion de consul­ta­tion de flux RSS pro­ve­nant d’un site de news de­puis un iP­hone ou un iPad. Nous en étions res­tés au vo­let pro­gram­ma­tion, en par­ti­cu­lier celle des ins­tances RSSI­tem.

L'Informaticien - - SOLUTIONS IT -

Nous al­lons ter­mi­ner dans cet ar­ticle le dé­ve­lop­pe­ment de notre ap­pli­ca­tion de consul­ta­tion d’in­for­ma­tions RSS. Il nous reste à voir la pro­gram­ma­tion des ins­tances RSSI­tem, la mise en place de la jour­na­li­sa­tion et l’uti­li­sa­tion de la classe UIWebView pour ou­vrir une ins­tance de na­vi­ga­teur. Nous conti­nuons donc le dé­ve­lop­pe­ment de notre ap­pli­ca­tion en voyant comment écrire le code de ges­tion des feuilles ter­mi­nales de l’arbre des ob­jets XML, en l’oc­cur­rence les ins­tances RSSI­tem. Nous al­lons pas­ser à la créa­tion d’une nou­velle sous-classe de NSOb­ject, que nous ap­pel­le­rons RSSI­tem. Une fois cette classe créée via Xcode, ou­vrez son fi­chier d’en-tête RSSI­tem.h. Nous al­lons com­men­cer par dé­cla­rer des va­riables d’ins­tance afin de gé­rer les mé­ta­don­nées du fi­chier XML et d’ana­ly­ser cha­cun de ses élé­ments : // // RSSI­tem.h // #im­port <Foun­da­tion/Foun­da­tion.h> @in­ter­face RSSI­tem : NSOb­ject <NSXMLPar­serDe­le­gate> {

NSMu­ta­bleS­tring *cur­rentS­tring; } @pro­per­ty (no­na­to­mic, strong) id pa­ren tPar­ser De­le­gate; @pro­per­ty (no­na­to­mic, strong) NSS­tring *title; @pro­per­ty (no­na­to­mic, strong) NSS­tring *link;

@end Ou­vrez en­suite le fi­chier d’im­plé­men­ta­tion, RSSI­tem.m. Nous al­lons spé­ci­fier l’im­plé­men­ta­tion au­to­ma­tique des va­riables d’ins­tance (pro­prié­tés) que nous ve­nons de dé­cla­rer à l’aide d’une ins­truc­tion @syn­the­size : // // RSSI­tem.m // #im­port "RSSI­tem.h" @im­ple­men­ta­tion RSSI­tem

@syn­the­size title, link, pa­rentPar­serDe­le­gate; - (void)par­ser:(NSXMLPar­ser *)par­ser didS­tartE­le­ment:(NSS­tring *)ele­mentName na­mes­pa­ceURI:(NSS­tring *)na­mes­pa­ceURI qua­li­fiedName:(NSS­tring *)qua­li­fiedName

at­tri­butes:(NSDic­tio­na­ry *)at­tri­bu­teDict

{

NSLog(@"\t\t%@ found a %@ ele­ment", self, ele­mentName); if ([ele­mentName isE­qual:@"title"]) { cur­rentS­tring = [[NSMu­ta­bleS­tring al­loc] init]; [self setTitle:cur­rentS­tring]; } else if ([ele­mentName isE­qual:@"link"]) { cur­rentS­tring = [[NSMu­ta­bleS­tring al­loc] init]; [self setLink:cur­rentS­tring];

}

} - foundC­ha­rac­ters:(NSS­tring (void)par­ser:(NSXMLPar­ser *)str *)par­ser {

[cur­rentS­tring ap­pendS­tring:str];

}

- (void)par­ser:(NSXMLPar­ser *)par­ser didEndE­le­ment:(NSS­tring *)ele­mentName na­mes­pa­ceURI:(NSS­tring *)na­mes­pa­ceURI qua­li­fiedName:(NSS­tring *)qName { cur­rentS­tring = nil; if ([ele­mentName isE­qual:@"item"])

[par­ser setDe­le­gate:pa­rentPar­serDe­le­gate];

}

@end Re­tour­nons main­te­nant dans RSSC­han­nel.m afin d’y in­sé­rer notre nou­velle classe, RSSI­tem, dans l’ar­bo­res­cence des ob­jets. En tout pre­mier lieu, il faut spé­ci­fier l’im­por­ta­tion du fi­chier d’en-tête de la classe RSSI­tem, RSSI­tem.h, avec une ins­truc­tion #im­port : // // RSSC­han­nel.m // // #im­port "RSSC­han­nel.h" #im­port "RSSI­tem.h" @im­ple­men­ta­tion RSSC­han­nel @syn­the­size items, title, in­foS­tring, pa­rentPar­serDe­le­gate; - (id)init {

self = [su­per init];

if (self) {

// Crée le contai­ner pour les RSSI­tems de ce ca­nal

items = [[NSMu­ta­bleAr­ray al­loc] init];

}

re­turn self;

} - (void)par­ser:(NSXMLPar­ser didS­tartE­le­ment:(NSS­tring *)par­ser *)ele­mentName

na­mes­pa­ceURI:(NSS­tring *)na­mes­pa­ceURI

qua­li­fiedName:(NSS­tring at­tri­butes:(NSDic­tio­na­ry *)qua­li­fiedName *)at­tri­bu­teDict

{ NSLog(@"\t%@ found a %@ ele­ment", self, ele­mentName); if ([ele­mentName isE­qual:@"title"]) { cur­rentS­tring = [[NSMu­ta­bleS­tring al­loc] init]; [self setTitle:cur­rentS­tring]; } else if ([ele­mentName isE­qual:@"des­crip­tion"]) { cur­rentS­tring = [[NSMu­ta­bleS­tring al­loc] init]; [self setIn­foS­tring:cur­rentS­tring]; } else if ([ele­mentName isE­qual:@"item"]) { // Quand un item est trou­vé, une nou­velle ins­tance // de la classe RSSI­tem est créée

RSSI­tem *en­try = [[RSSI­tem al­loc] init]; // Confi­gure son ob­jet pa­rent comme lui-même // afin de pou­voir re­prendre le contrôle du par­ser

[en­try setPa­rentPar­serDe­le­gate:self] ;

// Af­fecte l’ana­ly­seur à l’ob­jet de type RSSI­tem

[par­ser setDe­le­gate:en­try];

// Ajoute l’item au ta­bleau et le re­tire du fo­cus

[items addOb­ject:en­try];

} } - (void)par­ser:(NSXMLPar­ser *)par­ser foundC­ha­rac­ters:(NSS­tring *)str {

[cur­rentS­tring ap­pendS­tring:str];

}

- (void)par­ser:(NSXMLPar­ser *)par­ser didEndE­le­ment:(NSS­tring *)ele­mentName na­mes­pa­ceURI:(NSS­tring *)na­mes­pa­ceURI qua­li­fiedName:(NSS­tring *)qName {

// Si nous étions dans un élé­ment pour le­quel nous étions en train de

// ré­cu­pé­rer la chaîne de ca­rac­tères, ce­la sup­prime le fo­cus sur l’ob­jet

// et la va­riable conserve le contrôle des­sus. Si nous n’étions pas en train

// d’ana­ly­ser un élé­ment de ce type, cur­rentS­tring est dé­jà à nil.

cur­rentS­tring = nil;

// Si le der­nier élé­ment était le ca­nal, re­passe le contrôle à l’ob­jet qui l’avait

// juste avant if ([ele­mentName isE­qual:@"chan­nel"])

[par­ser setDe­le­gate:pa­rentPar­serDe­le­gate]; } @end Vé­ri­fiez si tout est cor­rect en lan­çant une nou­velle construc­tion de l’ap­pli­ca­tion. Vous de­vez voir s’af­fi­cher, dans les mes­sages de jour­na­li­sa­tion, la confir­ma­tion de la construc­tion de l’arbre. Le der­nier mes­sage doit nor­ma­le­ment mon­trer les don­nées de l’ob­jet ca­nal. Reste en­suite à re­lier le ca­nal et les élé­ments qui le com­posent à la vue table de l’ap­pli­ca­tion. Il faut re­ve­nir pour ce­la dans le fi­chier d’im­plé­men­ta­tion ListViewCo­n­trol­ler.m et de­man­der l’im­port du fi­chier RSSI­tem, puis com­plé­ter les ins­truc­tions des mé­thodes de source de don­nées :

// // // #im­port ListViewCo­n­trol­ler.m "ListViewCo­n­trol­ler.h" #im­port #im­port "RSSC­han­nel.h" "RSSI­tem.h" #im­port "WebViewCon­trol­ler.h" @im­ple­men­ta­tion @syn­the­size webViewCon­trol­ler; ListViewCo­n­trol­ler - { (id)ini­tWi­thS­tyle:(UITa­bleViewS­tyle)style

self = [su­per ini­tWi­thS­tyle:style]; if (self) {

[self re­cupEn­trees];

}

re­turn self;

} - (void)par­ser:(NSXMLPar­ser *)par­ser didS­tartE­le­ment:(NSS­tring *)ele­mentName na­mes­pa­ceURI:(NSS­tring *)na­mes­pa­ceURI qua­li­fiedName:(NSS­tring *)qua­li­fiedName

at­tri­butes:(NSDic­tio­na­ry *)at­tri­bu­teDict

{ NSLog(@"%@ found a %@ ele­ment", self, ele­mentName); if ([ele­mentName isE­qual:@"chan­nel"]) {

// Si le par­ser "voit" un ca­nal, une nou­velle ins­tance est créée

// et sto­ckée dans la va­riable chan­nel

chan­nel = [[RSSC­han­nel al­loc] init];

// At­tri­bue à l’ob­jet ca­nal un poin­teur prêt à l’em­ploi pour plus tard

[chan­nel setPa­rentPar­serDe­le­gate:self];

// Af­fecte le dé­lé­gué du par­ser à l’ob­jet chan­nel

[par­ser setDe­le­gate:chan­nel];

}

} - (void)con­nec­tion:(NSURLCon­nec­tion *)conn didRe­cei­veDa­ta:(NSDa­ta *)da­ta { // Ajoute le jeu de don­nées en­trant au contai­ner // Les don­nées ar­rivent tou­jours dans le bon ordre

[xmlDa­ta ap­pendDa­ta:da­ta];

} - (void)connec­tionDidFi­ni­shLoa­ding:(NSURLCon­nec­tion *) conn {

3 par­tie

Newspapers in French

Newspapers from France

© PressReader. All rights reserved.