{"id":3420,"date":"2010-05-18T11:16:29","date_gmt":"2010-05-18T09:16:29","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3420"},"modified":"2012-09-05T11:51:52","modified_gmt":"2012-09-05T09:51:52","slug":"t043-creiamo-il-nostro-lettore-di-feed-rss-per-iphone","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t043-creiamo-il-nostro-lettore-di-feed-rss-per-iphone\/","title":{"rendered":"T#043 &#8211; Creiamo il nostro lettore di feed RSS per iPhone"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-3426\" title=\"Schermata 2010-05-17 a 23.44.32\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png\" alt=\"\" width=\"52\" height=\"96\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32-161x300.png 161w\" sizes=\"auto, (max-width: 52px) 100vw, 52px\" \/><\/a> Oggi parleremo ancora di XML, questa volta, per\u00f2, con un esempio pratico. Andremo a creare infatti, con questo nuovo tutorial, un lettore di feed RSS per il nostro iPhone. Impareremo quindi a sfruttare il parser XML disponibile con l&#8217;SDK di Apple, &#8220;NSXMLParser&#8221;, per interfacciare la nostra applicazione, ad esempio, con i feed RSS del nostro sito. Ricaveremo un elenco delle ultime notizie pubblicate e, al tocco da parte dell&#8217;utente su una voce nell&#8217;elenco, faremo in modo di aprire una nuova vista con la news pronta da leggere. Interessante vero? Ma ora basta chiacchere e partiamo subito con il nostro tutorial.<!--more--><\/p>\n<h4>1. Creiamo un nuovo progetto<\/h4>\n<p>Aprimo Xcode, selezioniamo &#8220;File -&gt; New Project&#8221;. Nel men\u00f9 che ci appare selezioniamo &#8220;Navigation-Based Application&#8221;, clicchiamo su &#8220;Choose\u2026&#8221;, immettiamo come nome &#8220;SimpleRSSreader&#8221; e facciamo clic su &#8220;Save&#8221;. Abbiamo cos\u00ec creato il nostro nuovo progetto.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Immagine-13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3421\" title=\"Immagine 1\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Immagine-13-300x249.png\" alt=\"\" width=\"300\" height=\"249\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Immagine-13-300x249.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Immagine-13.png 813w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Solitamente tra le prime cose che facciamo \u00e8 realizzare la struttura grafica dell&#8217;applicazione. Oggi, per\u00f2, non sar\u00e0 necessario, in quanto Xcode ci fornisce gi\u00e0 un template predisposto, contenente una tabella (UITableView) che a suo volta conterr\u00e0 gli elementi che andremo a leggere. Ci concentreremo, quindi, sugli aspetti pi\u00f9 importanti.<\/p>\n<h4>2. Definiamo gli elementi necessari<\/h4>\n<p>Il primo file che andremo a modificare \u00e8 &#8220;RootViewController.h&#8221;. Apriamolo e, al suo interno, scriviamo il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">@interface RootViewController : UITableViewController   {\r\n\t\/\/ parser XML\r\n\tNSXMLParser *rssParser;\r\n\t\/\/ elenco degli elementi letti dal feed\r\n\tNSMutableArray *elencoFeed;\r\n\r\n\t\/\/variabile temporanea pe ogni elemento\r\n\tNSMutableDictionary *item;\r\n\r\n\t\/\/ valori dei campi letti dal feed\r\n\tNSString *currentElement;\r\n\tNSMutableString *currentTitle, *currentDate, *currentSummary, *currentLink;\r\n}\r\n\r\n- (void)parseXMLFileAtURL:(NSString *)URL;\r\n\r\n@end<\/pre>\n<p>Come gi\u00e0 saprete, questo \u00e8 il file di implementazione, in cui definiamo tutti gli elementi, quelli che vengono solitamente chiamati &#8220;variabili globali&#8221;. Questi elementi li utilizzeremo nei vari metodi che andremo a definire fra poco.<\/p>\n<p>Alla riga 3 abbiamo definito il nostro parser XML, che si occuper\u00e0 di leggere il feed RSS e di convertirne le notizie. Alla riga 5 \u00e8 definito un NSMutableArray, ovvero una collezione di oggetti, in cui inseriremo i vari feed letti (con le varie informazioni, ovvero titolo, data, testo, etc). Le dichiarazioni alle righe 7, 10 e 11 servono proprio per i metodi del parser, quindi non preoccupatevi troppo se non le capite pienamente.<\/p>\n<p>Apriamo, ora, il file &#8220;RootViewController.m&#8221;. Possiamo subito notare che sono gi\u00e0 presenti diversi metodi. Tutti si riferiscono alla definizione e al popolamento della tabella. Tali metodi sono obbligatori e necessari per il corretto funzionamento della tabella stessa.<\/p>\n<p>Iniziamo a modificare i metodi gi\u00e0 presenti a seconda delle nostre necessit\u00e0.<\/p>\n<p>Il primo metodo da modificare \u00e8 il seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\r\n    return [elencoFeed count];\r\n}<\/pre>\n<p>Questo metodo imposta il numero di righe della nostra tabella. Tale numero deve essere pari al numero di elementi che scarichiamo dal feed RSS. Ad esempio, se abbiamo ricavato 10 notizie dal nostro feed, dovranno essere 10 le righe della tabella, ovvio no?<\/p>\n<p>Le \u00a0parentesi quadre [] che trovate intorno all&#8217;elemento &#8220;elencoFeed&#8221; servono per richiamare un metodo o una propriet\u00e0: in questo caso abbiamo richiamato la propriet\u00e0 &#8220;count&#8221;, che ci ritorna il numero di elementi presenti nella nostra lista.<\/p>\n<p>Dobbiamo ora modificare il metodo che si occupa di inserire il testo all&#8217;interno delle varie celle. Ecco il metodo che si occupa di ci\u00f2:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\/\/ Customize the appearance of table view cells.\r\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\r\n\r\n    static NSString *CellIdentifier = @\"Cell\";\r\n\r\n    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];\r\n    if (cell == nil) {\r\n        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];\r\n    }\r\n\r\n   \/\/ Configure the cell.\r\n   cell.textLabel.text = [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@\"title\"];\r\n\r\n   return cell;\r\n}<\/pre>\n<p>Troveremo tale metodo gi\u00e0 definito, dovremo solo aggiungere l&#8217;istruzione alla riga 12. Tale istruzione va a ricavare l&#8217;elemento desiderato dalla lista (che coincide con il numero di riga, ricavato da &#8220;indexPath.row&#8221;), estrae quindi il campo &#8220;title&#8221; e lo setta come testo della cella.<\/p>\n<p>Se scorriamo verso il basso il file, possiamo notare alcuni metodi commentati (riconoscibili perch\u00e8 Xcode li colora in verde). Essi sono ancora relativi alla gestione della tabella, ma in questo tutorial non ci serviranno (tranne uno, che utilizzeremo dopo).<\/p>\n<p>Se provassimo ad eseguire il programma adesso, vedremmo che non farebbe ancora niente. Non abbiamo, infatti, ancora aggiunto la possibilit\u00e0 di scaricare il feed e di utilizzarlo. Quindi, ora, faremo proprio questo.<\/p>\n<h4>3. Definiamo le azioni del parser<\/h4>\n<p>Ci siamo occupati, fino ad ora, solo della definizione della tabella. Non abbiamo ancora visto nessun aspetto relativo al parser XML.<\/p>\n<p>Iniziamo, quindi, dal metodo &#8220;viewDidLoad&#8221; (lo possiamo trovare commentato tra le prime righe della classe):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void)viewDidLoad {\r\n        [super viewDidLoad];\r\n\r\n\tself.title = @\"devAPP RSS\";\r\n\r\n\tNSString *path = @\"http:\/\/feeds.feedburner.com\/devAPP\";\r\n\t[self parseXMLFileAtURL:path];\r\n\r\n    \/\/ Uncomment the following line to display an Edit button in the navigation bar for this view controller.\r\n    \/\/ self.navigationItem.rightBarButtonItem = self.editButtonItem;\r\n}<\/pre>\n<p>Come vedete abbiamo aggiunto alcune istruzioni. Alla riga 4 abbiamo settato un titolo alla nostra applicazione, che comparir\u00e0 nella navigation bar sopra la tabella. Alla riga 6, invece, viene definita, una stringa &#8220;path&#8221;, in cui inseriamo l&#8217;indirizzo del feed RSS che vogliamo leggere. Alla riga successiva, infine, avviamo il parsing del feed (tramite il metodo &#8220;parseXMLFileAtURL&#8221;, di cui abbiamo definito l&#8217;intestazione nel file &#8220;RootViewController.h&#8221;), passando proprio l&#8217;indirizzo &#8220;path&#8221; come parametro.<\/p>\n<p>Tale metodo, per\u00f2, non \u00e8 ancora stato implementato nella nostra funzione. Ecco come dovremo definirlo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void)parseXMLFileAtURL:(NSString *)URL {\r\n\t\/\/ inizializziamo la lista degli elementi\r\n\telencoFeed = [[NSMutableArray alloc] init];\r\n\r\n\t\/\/ dobbiamo convertire la stringa \"URL\" in un elemento \"NSURL\"\r\n\tNSURL *xmlURL = [NSURL URLWithString:URL];\r\n\r\n\t\/\/ inizializziamo il nostro parser XML\r\n\trssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];\r\n\r\n\t[rssParser setDelegate:self];\r\n\r\n\t\/\/ settiamo alcune propriet\u00e0\r\n\t[rssParser setShouldProcessNamespaces:NO];\r\n\t[rssParser setShouldReportNamespacePrefixes:NO];\r\n\t[rssParser setShouldResolveExternalEntities:NO];\r\n\r\n\t\/\/ avviamo il parsing del feed RSS\r\n\t[rssParser parse];\r\n}<\/pre>\n<p>Come vedete il metodo non \u00e8 molto complicato. I commenti presenti ci possono chiarire le varie istruzioni. Si parte dall&#8217;inizializzazione dell&#8217;array &#8220;elencoFeed&#8221;, per poi passare all&#8217;inizializzazione del parser XML e al suo avvio.<\/p>\n<p>Per funzionare correttamente, il parser ha bisogno di altri due metodi. Eccoveli (anche questi sono da inserire in &#8220;RootViewController.m&#8221;):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{\t\t\t\r\n\r\n\tcurrentElement = [elementName copy];\r\n\tif ([elementName isEqualToString:@\"item\"]) {\r\n\t\t\/\/ inizializza tutti gli elementi\r\n\t\titem = [[NSMutableDictionary alloc] init];\r\n\t\tcurrentTitle = [[NSMutableString alloc] init];\r\n\t\tcurrentDate = [[NSMutableString alloc] init];\r\n\t\tcurrentSummary = [[NSMutableString alloc] init];\r\n\t\tcurrentLink = [[NSMutableString alloc] init];\r\n\t}\r\n}\r\n\r\n- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     \r\n\r\n\tif ([elementName isEqualToString:@\"item\"]) {\r\n\t\t\/* salva tutte le propriet\u00e0 del feed letto nell'elemento \"item\", per\r\n\t\t   poi inserirlo nell'array \"elencoFeed\" *\/\r\n\t\t[item setObject:currentTitle forKey:@\"title\"];\r\n\t\t[item setObject:currentLink forKey:@\"link\"];\r\n\t\t[item setObject:currentSummary forKey:@\"summary\"];\r\n\t\t[item setObject:currentDate forKey:@\"date\"];\r\n\r\n\t\t[elencoFeed addObject:[item copy]];\r\n\t}\r\n}<\/pre>\n<p>Questi due metodi vengono richiamati, rispettivamente, quando inizia e quando finisce un elemento XML. Nel primo caso dovremo re-inizializzare tutti gli elementi, in modo da poter leggere un nuovo elemento senza errori. Al contrario, quando un elemento XML termina dovremo salvare tutti questi valori letti in un unico elemento (&#8220;item&#8221;) e inserirlo nella lista dei feed letti (&#8220;elencoFeed&#8221;).<\/p>\n<p>Per completare la definizione del parser ci mancano altri due metodi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{;\r\n\t\/\/ salva i caratteri per l'elemento corrente\r\n\tif ([currentElement isEqualToString:@\"title\"]){\r\n\t\t[currentTitle appendString:string];\r\n\t} else if ([currentElement isEqualToString:@\"link\"]) {\r\n\t\t[currentLink appendString:string];\r\n\t} else if ([currentElement isEqualToString:@\"description\"]) {\r\n\t\t[currentSummary appendString:string];\r\n\t} else if ([currentElement isEqualToString:@\"pubDate\"]) {\r\n\t\t[currentDate appendString:string];\r\n\t}\r\n}\r\n\r\n- (void) parserDidEndDocument:(NSXMLParser *)parser {\r\n\t[self.tableView reloadData];\r\n}<\/pre>\n<p>Il primo metodo viene richiamato ogni volta che viene letto un carattere all&#8217;interno del feed. A seconda dell&#8217;elemento che siamo considerando, andremo a inserire il carattere letto in coda a quelli gi\u00e0 letti dello stesso carattere, in modo da ricostruire l&#8217;informazione completa. Ad esempio, stiamo considerando l&#8217;elemento &#8220;title&#8221;. Vengono letti, nell&#8217;ordine, i seguenti caratteri &#8220;Dev&#8221;, &#8220;Tutorial &#8220;, &#8220;#2&#8221;. Unendo i vari caratteri letti ricostruiremo il titolo esatto del nostro feed, ovvero &#8220;DevTutorial #2&#8221;.<\/p>\n<p>Il secondo metodo, invece, viene richiamato solo quando il parser completa la lettura del feed RSS, e noi non faremo altro che dire alla tabella di &#8220;ricarcarsi&#8221; (verranno, quindi, richiamati i metodi per settare il numero di righe e per inserire il testo nelle varie celle).<\/p>\n<h4>4. Concludiamo l&#8217;applicazione<\/h4>\n<p>Abbiamo ormai concluso la nostra applicazione!!<\/p>\n<p>Come sempre dobbiamo ricordarci di completare il metodo &#8220;dealloc&#8221;, che \u00e8 davvero molto importante, soprattutto nelle applicazioni di un certo grado di complessit\u00e0. Ecco come dovremo definire il metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void)dealloc {\r\n\t[currentElement release];\r\n\t[rssParser release];\r\n\t[elencoFeed release];\r\n\t[item release];\r\n\t[currentTitle release];\r\n\t[currentDate release];\r\n\t[currentSummary release];\r\n\t[currentLink release];\r\n\r\n    [super dealloc];\r\n}<\/pre>\n<p>Ora siamo pronti per compilare ed eseguire la nostra applicazione! Clicchiamo su &#8220;Build and Run!&#8221; e testiamo il nostro personalissimo lettore di feed RSS!!<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.22.41.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3422\" title=\"Schermata 2010-05-17 a 23.22.41\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.22.41.png\" alt=\"\" width=\"414\" height=\"770\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.22.41.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.22.41-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.22.41-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><\/p>\n<h4>5. Un piccolo miglioramento<\/h4>\n<p>La nostra applicazione funziona ma.. provate a cliccare su un elemento. Non succeder\u00e0 niente. Non sarebbe invece pi\u00f9 carino se si aprisse una nuova vista in cui venisse caricato l&#8217;articolo completo. Ci baster\u00e0, quindi, creare una nuova vista, in cui inseriremo una UIWebView, che sar\u00e0 il nostro browser per l&#8217;articolo.<\/p>\n<p>Dal men\u00f9 &#8220;File&#8221; scegliamo &#8220;New File&#8230;&#8221;, andiamo nella sezione &#8220;Cocoa Touch Class&#8221; e scegliamo &#8220;UIViewController subclass&#8221; come tipo di classe, spuntando inoltre l&#8217;opzione &#8220;With XIB for user interface&#8221;:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.26.50.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3423\" title=\"Schermata 2010-05-17 a 23.26.50\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.26.50-300x249.png\" alt=\"\" width=\"300\" height=\"249\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.26.50-300x249.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.26.50-150x124.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.26.50.png 813w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Inseriamo &#8220;ViewArticolo&#8221; come nome e clicchiamo su &#8220;Finish&#8221;. Abbiamo cos\u00ec creato la classe e la relativa vista.<\/p>\n<p>Apriamo il file &#8220;ViewArticolo.h&#8221; e inseriamo le seguenti dichiarazioni:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface ViewArticolo : UIViewController {\r\n\tIBOutlet UIWebView *webView;\r\n\r\n\tNSString *indirizzo;\r\n}\r\n\r\n@property (nonatomic, retain) NSString *indirizzo;\r\n\r\n@end<\/pre>\n<p>Come potete facilmente notare, abbiamo dichiarato una UIWebView (che andremo fra poco a definire in Interface Builder) e una variabile indirizzo, che conterr\u00e0 l&#8217;URL dell&#8217;articolo da caricare.<\/p>\n<p>Apriamo ora il file &#8220;ViewArticolo.m&#8221; e inseriamo il seguente codice (che vi abbiamo gi\u00e0 spiegato in <a href=\"http:\/\/www.devapp.it\/wordpress\/t008-creiamo-un-browser.html\" target=\"_blank\">questo tutorial<\/a>):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">#import \"ViewArticolo.h\"\r\n\r\n@implementation ViewArticolo\r\n\r\n@synthesize indirizzo;\r\n\r\n\/\/ Implement viewDidLoad to do additional setup after loading the view, typically from a nib.\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\t\/\/crea un oggetto URL\r\n\tNSURL *url = [NSURL URLWithString:indirizzo];\r\n\tNSURLRequest *requestObj = [NSURLRequest requestWithURL:url];\r\n\t\/\/ visualizza la pagina nella UIWebView\r\n\t[webView loadRequest:requestObj];\r\n}<\/pre>\n<p>Salviamo entrambi i file e apriamo &#8220;ViewArticolo.xib&#8221;, in cui andremo ad inserire la UIWebView. Dalla Libreria prendiamo un componente di tipo UIWebView e inseriamolo nella vista, cos\u00ec:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.39.12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3424\" title=\"Schermata 2010-05-17 a 23.39.12\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.39.12-206x299.png\" alt=\"\" width=\"206\" height=\"299\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.39.12-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.39.12-103x149.png 103w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.39.12.png 400w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/a><\/p>\n<p>Apriamo, infine, il Pannello dei Documenti, selezioniamo il &#8220;File&#8217;s Owner&#8221; \u00a0e colleghiamo l&#8217;elemento &#8220;webView&#8221; con la UIWebView che abbiamo appena inserito nella vista:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.40.18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3425\" title=\"Schermata 2010-05-17 a 23.40.18\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.40.18.png\" alt=\"\" width=\"301\" height=\"228\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.40.18.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.40.18-300x227.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.40.18-150x113.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><\/p>\n<p>Salviamo tutto e chiudiamo Interface Builder.<\/p>\n<p>Abbiamo quasi concluso! Torniamo al file\u00a0&#8220;RootViewController.m&#8221; e cerchiamo il metodo &#8220;tableView: didSelectRowAtIndexPath:&#8221; (\u00e8 uno di quelli commentati che vi avevo accennato prima). Questo metodo viene richiamato ogni volta che si &#8220;clicca&#8221; su una cella. Sar\u00e0 qui che andremo ad inserire il codice necessario che ci permetter\u00e0 di aprire la news selezionata:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\/\/ Override to support row selection in the table view.\r\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\r\n\r\n\t\/\/ ricaviamo il link dell'elemento selezionato\r\n\tNSString *link = [[elencoFeed objectAtIndex:indexPath.row] objectForKey: @\"link\"];\r\n\r\n\t\/\/ ripiliamo il link da spazi, return e tabs\r\n\tlink = [link stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\r\n\tlink = [link stringByReplacingOccurrencesOfString:@\"\\n\" withString:@\"\"];\r\n\tlink = [link stringByReplacingOccurrencesOfString:@\"\t\" withString:@\"\"];\r\n\r\n\t\/\/ apriamo la nuova vista\r\n\tViewArticolo *controller = [[ViewArticolo alloc] initWithNibName:@\"ViewArticolo\" bundle:nil];\r\n\tcontroller.indirizzo = link;\r\n\t[self.navigationController pushViewController:controller animated:YES];\r\n}<\/pre>\n<p>Il procedimento \u00e8 molto simile a quello visto per la definizione delle celle della tabella. Alla riga 4, infatti, andiamo a ricavare la propriet\u00e0 &#8220;link&#8221; dell&#8217;elemento selezionato, associandola ad una stringa chiamata appunto &#8220;link&#8221;. Con le istruzioni seguenti, invece, ripuliamo l&#8217;indirizzo da eventuali caratteri indesiderati, come spazi, return o tab. Con le ultime istruzioni inizializziamo la classe relativa alla vista che abbiamo appena definito, passandogli come parametro l&#8217;indirizzo dell&#8217;articolo che l&#8217;utente ha selezionato.<\/p>\n<p>Manca solo una piccolissima cosa da fare: sempre nel file &#8220;RootViewController.m&#8221; inseriamo l&#8217;importazione della &#8220;ViewArticolo&#8221; (riga 2):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">#import \"RootViewController.h\"\r\n#import \"ViewArticolo.h\"\r\n\r\n@implementation RootViewController<\/pre>\n<p>Salviamo il tutto, clicchiamo su &#8220;Build and Run&#8221; e godiamoci la nostra bellissima applicazione!!<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3426\" title=\"Schermata 2010-05-17 a 23.44.32\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png\" alt=\"\" width=\"414\" height=\"770\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/Schermata-2010-05-17-a-23.44.32-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/SimpleRSSreader.zip\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il tutorial, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/SimpleRSSreader.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p><strong><span style=\"color: #ff0000;\">Nota:<\/span><\/strong> Purtroppo &#8220;NSXMLParser&#8221; \u00e8 l&#8217;unico parser XML semplice e disponibile su iPhone. Questo ha molti svantaggi, non \u00e8 perfetto e presenta diversi problemi relativi alla gestione della memoria. Per questo esempio, tuttavia, \u00e8 pi\u00f9 che sufficiente, per\u00f2 se vi servisse per un&#8217;applicazione pi\u00f9 complessa prendete in seria considerazione l&#8217;idea di realizzarvi un parser tutto vostro.<\/p>\n<p style=\"text-align: right;\"><em>La guida \u00e8 stata tradotta e ampliata da Andrea Busi. Trovare la versione originale a questo indirizzo: <\/em><a href=\"http:\/\/theappleblog.com\/2008\/08\/04\/tutorial-build-a-simple-rss-reader-for-iphone\/\" target=\"_blank\"><em>iPhone SDK Tutorial: Build a Simple RSS reader for the iPhone<\/em><\/a><em>. I meriti, quindi, sono dei legitimi autori per le rispettive versioni.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi parleremo ancora di XML, questa volta, per\u00f2, con un esempio pratico. Andremo a creare infatti, con&#8230;<\/p>\n","protected":false},"author":254,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[216,225,226,223,88,224],"class_list":["post-3420","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-busi","tag-feed-rss-iphone","tag-nsxmlparser","tag-parsing-xml","tag-programmazione-iphone","tag-xml-iphone"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/254"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3420"}],"version-history":[{"count":13,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3420\/revisions"}],"predecessor-version":[{"id":9462,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3420\/revisions\/9462"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}