• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

T#043 – Creiamo il nostro lettore di feed RSS per iPhone

By Andrea Busi | on 18 Maggio 2010 | 76 Comments
Senza categoria

Oggi parleremo ancora di XML, questa volta, però, 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’SDK di Apple, “NSXMLParser”, 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’utente su una voce nell’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.

1. Creiamo un nuovo progetto

Aprimo Xcode, selezioniamo “File -> New Project”. Nel menù che ci appare selezioniamo “Navigation-Based Application”, clicchiamo su “Choose…”, immettiamo come nome “SimpleRSSreader” e facciamo clic su “Save”. Abbiamo così creato il nostro nuovo progetto.

Solitamente tra le prime cose che facciamo è realizzare la struttura grafica dell’applicazione. Oggi, però, non sarà necessario, in quanto Xcode ci fornisce già un template predisposto, contenente una tabella (UITableView) che a suo volta conterrà gli elementi che andremo a leggere. Ci concentreremo, quindi, sugli aspetti più importanti.

2. Definiamo gli elementi necessari

Il primo file che andremo a modificare è “RootViewController.h”. Apriamolo e, al suo interno, scriviamo il seguente codice:

@interface RootViewController : UITableViewController   {
	// parser XML
	NSXMLParser *rssParser;
	// elenco degli elementi letti dal feed
	NSMutableArray *elencoFeed;

	//variabile temporanea pe ogni elemento
	NSMutableDictionary *item;

	// valori dei campi letti dal feed
	NSString *currentElement;
	NSMutableString *currentTitle, *currentDate, *currentSummary, *currentLink;
}

- (void)parseXMLFileAtURL:(NSString *)URL;

@end

Come già saprete, questo è il file di implementazione, in cui definiamo tutti gli elementi, quelli che vengono solitamente chiamati “variabili globali”. Questi elementi li utilizzeremo nei vari metodi che andremo a definire fra poco.

Alla riga 3 abbiamo definito il nostro parser XML, che si occuperà di leggere il feed RSS e di convertirne le notizie. Alla riga 5 è 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.

Apriamo, ora, il file “RootViewController.m”. Possiamo subito notare che sono già 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.

Iniziamo a modificare i metodi già presenti a seconda delle nostre necessità.

Il primo metodo da modificare è il seguente:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [elencoFeed count];
}

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?

Le  parentesi quadre [] che trovate intorno all’elemento “elencoFeed” servono per richiamare un metodo o una proprietà: in questo caso abbiamo richiamato la proprietà “count”, che ci ritorna il numero di elementi presenti nella nostra lista.

Dobbiamo ora modificare il metodo che si occupa di inserire il testo all’interno delle varie celle. Ecco il metodo che si occupa di ciò:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

   // Configure the cell.
   cell.textLabel.text = [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@"title"];

   return cell;
}

Troveremo tale metodo già definito, dovremo solo aggiungere l’istruzione alla riga 12. Tale istruzione va a ricavare l’elemento desiderato dalla lista (che coincide con il numero di riga, ricavato da “indexPath.row”), estrae quindi il campo “title” e lo setta come testo della cella.

Se scorriamo verso il basso il file, possiamo notare alcuni metodi commentati (riconoscibili perchè 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).

Se provassimo ad eseguire il programma adesso, vedremmo che non farebbe ancora niente. Non abbiamo, infatti, ancora aggiunto la possibilità di scaricare il feed e di utilizzarlo. Quindi, ora, faremo proprio questo.

3. Definiamo le azioni del parser

Ci siamo occupati, fino ad ora, solo della definizione della tabella. Non abbiamo ancora visto nessun aspetto relativo al parser XML.

Iniziamo, quindi, dal metodo “viewDidLoad” (lo possiamo trovare commentato tra le prime righe della classe):

- (void)viewDidLoad {
        [super viewDidLoad];

	self.title = @"devAPP RSS";

	NSString *path = @"http://feeds.feedburner.com/devAPP";
	[self parseXMLFileAtURL:path];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

Come vedete abbiamo aggiunto alcune istruzioni. Alla riga 4 abbiamo settato un titolo alla nostra applicazione, che comparirà nella navigation bar sopra la tabella. Alla riga 6, invece, viene definita, una stringa “path”, in cui inseriamo l’indirizzo del feed RSS che vogliamo leggere. Alla riga successiva, infine, avviamo il parsing del feed (tramite il metodo “parseXMLFileAtURL”, di cui abbiamo definito l’intestazione nel file “RootViewController.h”), passando proprio l’indirizzo “path” come parametro.

Tale metodo, però, non è ancora stato implementato nella nostra funzione. Ecco come dovremo definirlo:

- (void)parseXMLFileAtURL:(NSString *)URL {
	// inizializziamo la lista degli elementi
	elencoFeed = [[NSMutableArray alloc] init];

	// dobbiamo convertire la stringa "URL" in un elemento "NSURL"
	NSURL *xmlURL = [NSURL URLWithString:URL];

	// inizializziamo il nostro parser XML
	rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

	[rssParser setDelegate:self];

	// settiamo alcune proprietà
	[rssParser setShouldProcessNamespaces:NO];
	[rssParser setShouldReportNamespacePrefixes:NO];
	[rssParser setShouldResolveExternalEntities:NO];

	// avviamo il parsing del feed RSS
	[rssParser parse];
}

Come vedete il metodo non è molto complicato. I commenti presenti ci possono chiarire le varie istruzioni. Si parte dall’inizializzazione dell’array “elencoFeed”, per poi passare all’inizializzazione del parser XML e al suo avvio.

Per funzionare correttamente, il parser ha bisogno di altri due metodi. Eccoveli (anche questi sono da inserire in “RootViewController.m”):

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{			

	currentElement = [elementName copy];
	if ([elementName isEqualToString:@"item"]) {
		// inizializza tutti gli elementi
		item = [[NSMutableDictionary alloc] init];
		currentTitle = [[NSMutableString alloc] init];
		currentDate = [[NSMutableString alloc] init];
		currentSummary = [[NSMutableString alloc] init];
		currentLink = [[NSMutableString alloc] init];
	}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     

	if ([elementName isEqualToString:@"item"]) {
		/* salva tutte le proprietà del feed letto nell'elemento "item", per
		   poi inserirlo nell'array "elencoFeed" */
		[item setObject:currentTitle forKey:@"title"];
		[item setObject:currentLink forKey:@"link"];
		[item setObject:currentSummary forKey:@"summary"];
		[item setObject:currentDate forKey:@"date"];

		[elencoFeed addObject:[item copy]];
	}
}

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 (“item”) e inserirlo nella lista dei feed letti (“elencoFeed”).

Per completare la definizione del parser ci mancano altri due metodi:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{;
	// salva i caratteri per l'elemento corrente
	if ([currentElement isEqualToString:@"title"]){
		[currentTitle appendString:string];
	} else if ([currentElement isEqualToString:@"link"]) {
		[currentLink appendString:string];
	} else if ([currentElement isEqualToString:@"description"]) {
		[currentSummary appendString:string];
	} else if ([currentElement isEqualToString:@"pubDate"]) {
		[currentDate appendString:string];
	}
}

- (void) parserDidEndDocument:(NSXMLParser *)parser {
	[self.tableView reloadData];
}

Il primo metodo viene richiamato ogni volta che viene letto un carattere all’interno del feed. A seconda dell’elemento che siamo considerando, andremo a inserire il carattere letto in coda a quelli già letti dello stesso carattere, in modo da ricostruire l’informazione completa. Ad esempio, stiamo considerando l’elemento “title”. Vengono letti, nell’ordine, i seguenti caratteri “Dev”, “Tutorial “, “#2”. Unendo i vari caratteri letti ricostruiremo il titolo esatto del nostro feed, ovvero “DevTutorial #2”.

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 “ricarcarsi” (verranno, quindi, richiamati i metodi per settare il numero di righe e per inserire il testo nelle varie celle).

4. Concludiamo l’applicazione

Abbiamo ormai concluso la nostra applicazione!!

Come sempre dobbiamo ricordarci di completare il metodo “dealloc”, che è davvero molto importante, soprattutto nelle applicazioni di un certo grado di complessità. Ecco come dovremo definire il metodo:

- (void)dealloc {
	[currentElement release];
	[rssParser release];
	[elencoFeed release];
	[item release];
	[currentTitle release];
	[currentDate release];
	[currentSummary release];
	[currentLink release];

    [super dealloc];
}

Ora siamo pronti per compilare ed eseguire la nostra applicazione! Clicchiamo su “Build and Run!” e testiamo il nostro personalissimo lettore di feed RSS!!

5. Un piccolo miglioramento

La nostra applicazione funziona ma.. provate a cliccare su un elemento. Non succederà niente. Non sarebbe invece più carino se si aprisse una nuova vista in cui venisse caricato l’articolo completo. Ci basterà, quindi, creare una nuova vista, in cui inseriremo una UIWebView, che sarà il nostro browser per l’articolo.

Dal menù “File” scegliamo “New File…”, andiamo nella sezione “Cocoa Touch Class” e scegliamo “UIViewController subclass” come tipo di classe, spuntando inoltre l’opzione “With XIB for user interface”:

Inseriamo “ViewArticolo” come nome e clicchiamo su “Finish”. Abbiamo così creato la classe e la relativa vista.

Apriamo il file “ViewArticolo.h” e inseriamo le seguenti dichiarazioni:

#import 

@interface ViewArticolo : UIViewController {
	IBOutlet UIWebView *webView;

	NSString *indirizzo;
}

@property (nonatomic, retain) NSString *indirizzo;

@end

Come potete facilmente notare, abbiamo dichiarato una UIWebView (che andremo fra poco a definire in Interface Builder) e una variabile indirizzo, che conterrà l’URL dell’articolo da caricare.

Apriamo ora il file “ViewArticolo.m” e inseriamo il seguente codice (che vi abbiamo già spiegato in questo tutorial):

#import "ViewArticolo.h"

@implementation ViewArticolo

@synthesize indirizzo;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
	//crea un oggetto URL
	NSURL *url = [NSURL URLWithString:indirizzo];
	NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
	// visualizza la pagina nella UIWebView
	[webView loadRequest:requestObj];
}

Salviamo entrambi i file e apriamo “ViewArticolo.xib”, in cui andremo ad inserire la UIWebView. Dalla Libreria prendiamo un componente di tipo UIWebView e inseriamolo nella vista, così:

Apriamo, infine, il Pannello dei Documenti, selezioniamo il “File’s Owner”  e colleghiamo l’elemento “webView” con la UIWebView che abbiamo appena inserito nella vista:

Salviamo tutto e chiudiamo Interface Builder.

Abbiamo quasi concluso! Torniamo al file “RootViewController.m” e cerchiamo il metodo “tableView: didSelectRowAtIndexPath:” (è uno di quelli commentati che vi avevo accennato prima). Questo metodo viene richiamato ogni volta che si “clicca” su una cella. Sarà qui che andremo ad inserire il codice necessario che ci permetterà di aprire la news selezionata:

// Override to support row selection in the table view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

	// ricaviamo il link dell'elemento selezionato
	NSString *link = [[elencoFeed objectAtIndex:indexPath.row] objectForKey: @"link"];

	// ripiliamo il link da spazi, return e tabs
	link = [link stringByReplacingOccurrencesOfString:@" " withString:@""];
	link = [link stringByReplacingOccurrencesOfString:@"\n" withString:@""];
	link = [link stringByReplacingOccurrencesOfString:@"	" withString:@""];

	// apriamo la nuova vista
	ViewArticolo *controller = [[ViewArticolo alloc] initWithNibName:@"ViewArticolo" bundle:nil];
	controller.indirizzo = link;
	[self.navigationController pushViewController:controller animated:YES];
}

Il procedimento è molto simile a quello visto per la definizione delle celle della tabella. Alla riga 4, infatti, andiamo a ricavare la proprietà “link” dell’elemento selezionato, associandola ad una stringa chiamata appunto “link”. Con le istruzioni seguenti, invece, ripuliamo l’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’indirizzo dell’articolo che l’utente ha selezionato.

Manca solo una piccolissima cosa da fare: sempre nel file “RootViewController.m” inseriamo l’importazione della “ViewArticolo” (riga 2):

#import "RootViewController.h"
#import "ViewArticolo.h"

@implementation RootViewController

Salviamo il tutto, clicchiamo su “Build and Run” e godiamoci la nostra bellissima applicazione!!

Se avete problemi con il tutorial, questo è il nostro file di progetto.

Nota: Purtroppo “NSXMLParser” è l’unico parser XML semplice e disponibile su iPhone. Questo ha molti svantaggi, non è perfetto e presenta diversi problemi relativi alla gestione della memoria. Per questo esempio, tuttavia, è più che sufficiente, però se vi servisse per un’applicazione più complessa prendete in seria considerazione l’idea di realizzarvi un parser tutto vostro.

La guida è stata tradotta e ampliata da Andrea Busi. Trovare la versione originale a questo indirizzo: iPhone SDK Tutorial: Build a Simple RSS reader for the iPhone. I meriti, quindi, sono dei legitimi autori per le rispettive versioni.

Share this story:
  • tweet

Tags: andrea busifeed RSS iphoneNSXMLParserparsing XMLprogrammazione iphoneTutorial PraticiXML iPhone

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • “Tutorial pratici per iOS SDK” si aggiorna alla versione 2.1

    10 Maggio 2012 - 1 Comment
  • Tutorial pratici per iOS SDK: disponibile la versione 2.0 aggiornata a iOS 5 e XCode 4.2

    16 Novembre 2011 - 6 Comments
  • T#096 – Facciamoci lasciare una recensione in App Store dalla nostra applicazione con Appirater

    15 Giugno 2011 - 40 Comments

Author Description

23 anni, è studente di Ingegneria Informatica presso l’Università di Bergamo (laurea Magistrale). Appassionato d’informatica sin da bambino, conosce molto bene il C++, Java e l'ObjectiveC, con cui ormai programma con successo da qualche anno. Ha già scritto un ebook “Tutorial pratici per iPhone SDK”, che ha avuto un ottimo successo, e gestisce da quasi due anni BubiDevs, un piccolo blog che ha dato l’ispirazione anche a devAPP.

76 Responses to “T#043 – Creiamo il nostro lettore di feed RSS per iPhone”

  1. 18 Maggio 2010

    DevTutorial #2 – Creiamo un semplice lettore di Feed RSS - Bubi Devs

    […] Leggi il tutorial completo su devAPP Condividi tweetmeme_url = 'http://www.bubidevs.net/2008/10/07/devtutorial-2-my-rss-reader/'; (function() { var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0]; s.type = 'text/javascript'; s.src = 'http://widgets.digg.com/buttons.js'; s1.parentNode.insertBefore(s, s1); })(); […]

  2. 18 Maggio 2010

    max_dl

    Grandi!!!! Una domanda, se volessi aggiungere altri dati all’elenco scaricato dal feed? Ad esempio la data, un breve accenno all’articolo, l’autore ed eventualmente un’immagine? Un po’ come accade nella maggior parte delle applicazioni di news?

  3. 18 Maggio 2010

    Andrea Busi


    max_dl:

    Grandi!!!! Una domanda, se volessi aggiungere altri dati all’elenco scaricato dal feed? Ad esempio la data, un breve accenno all’articolo, l’autore ed eventualmente un’immagine? Un po’ come accade nella maggior parte delle applicazioni di news?

    dovrai andare a leggere le informazioni che ti servono nel metodo “foundCharacters”, ovviamente predisponendo anche altre variabili in cui salvare i dati letti..

    non so dirti di preciso quali tag siano, però ti basta aprire il file XML del feed e li vedi subito (dovrebbero essere author per l’autore, mentre l’immagine dipende da come è stato fatto il feed)..

  4. 19 Maggio 2010

    Fede81

    Ciao, nel tutorial preleviamo dal feed 4 valori:

    – title
    – link
    – description
    – pubDate

    Nella tabella, poi, mostriamo “title” tramite:

    cell.textLabel.text = [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@”title”];

    La mia domanda è questa: ho provato a sostituire “title” con gli altri 4, alternandoli, per verificare l’esatto prelevamento di tutti questi campi, come mai riesco a visualizzare solo elenco “title” e “link”, mentre “description” e “pubDate” non riesco a vederli? Ho anche provato via NSLog.. funziona tutto solo con i primi due..

    Grazie mille e scusate il poema ;P

  5. 20 Maggio 2010

    Vincenzo

    E’ possibile adattare questo esempio per prelevare dati da una pagina web normale? Ad esempio il contenuto delle ? Stò cercando in tutti i modi un esempio ma non ci riesco.

  6. 20 Maggio 2010

    Andrea Busi


    Fede81:

    Ciao, nel tutorial preleviamo dal feed 4 valori:

    – title
    – link
    – description
    – pubDate

    Nella tabella, poi, mostriamo “title” tramite:

    cell.textLabel.text = [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@”title”];

    La mia domanda è questa: ho provato a sostituire “title” con gli altri 4, alternandoli, per verificare l’esatto prelevamento di tutti questi campi, come mai riesco a visualizzare solo elenco “title” e “link”, mentre “description” e “pubDate” non riesco a vederli? Ho anche provato via NSLog.. funziona tutto solo con i primi due..

    Grazie mille e scusate il poema ;P

    dovresti controllare la struttura del tuo feed XML, può darsi che siano diversi i valori da leggere.. Ad esempio, description potrebbe anche essere content 😉


    Vincenzo:

    E’ possibile adattare questo esempio per prelevare dati da una pagina web normale? Ad esempio il contenuto delle ? Stò cercando in tutti i modi un esempio ma non ci riesco.

    no, se la struttura non è XML questa guida non va bene, devi crearti un tuo procedimento ad-hoc..

  7. 21 Maggio 2010

    pasquale

    molto interessante …..
    ma se volessi dividere la tabella in due sezioni tutorial e articoli……..
    grazie

  8. 21 Maggio 2010

    Mokka77

    Grande tutorial! Unico problema, anche io non riesco a leggere “description” e “pubDate”.. Ho usato il feed rss di devAPP.. Quello dell’esempio.. 🙁

  9. 21 Maggio 2010

    Andrea Busi


    Mokka77:

    Grande tutorial! Unico problema, anche io non riesco a leggere “description” e “pubDate”.. Ho usato il feed rss di devAPP.. Quello dell’esempio.. :(

    si scusate, c’è un piccolo errore. Per leggere l’anteprima dell’articolo nel feed di devAPP dovete utilizzare come tag “content:encoded” al posto di “description”..

    domani sistemiamo l’articolo 😉

    P.S: pubDate è giusta e dovete riuscire a leggerla 😉

  10. 2 Giugno 2010

    Davide

    Salve faccio parte dei principiantissimi ed ho apprezzato un sacco questo articolo, mi potete guidare passo passo come nel tutorial a farlo diventare cosi: http://www.devapp.it/wordpress/wp-content/uploads/2010/05/Schermata-2010-05-17-a-23.44.32.png

    chiedo troppo?

  11. 2 Giugno 2010

    Davide

    l’ideale sarebbe avere un risultato simile alle pagine web fatte dal plugin WPTouch ma il mio sito non è in wordpress… e poi vorrei proprio l’applicazione… o al massimo sapete come ottenere un sito in versione mobile come quello con wptouch?

  12. 2 Giugno 2010

    Andrea Busi


    Davide:

    l’ideale sarebbe avere un risultato simile alle pagine web fatte dal plugin WPTouch ma il mio sito non è in wordpress… e poi vorrei proprio l’applicazione… o al massimo sapete come ottenere un sito in versione mobile come quello con wptouch?

    penso che ti convenga lavorare in HTML, realizzare una struttura come quella di WPTouch in XCode potrebbe richiedere troppo lavoro che, a mio avviso, sarebbe anche un po’ inutile..

  13. 3 Giugno 2010

    Davide


    Andrea Busi:


    Davide:

    l’ideale sarebbe avere un risultato simile alle pagine web fatte dal plugin WPTouch ma il mio sito non è in wordpress… e poi vorrei proprio l’applicazione… o al massimo sapete come ottenere un sito in versione mobile come quello con wptouch?

    penso che ti convenga lavorare in HTML, realizzare una struttura come quella di WPTouch in XCode potrebbe richiedere troppo lavoro che, a mio avviso, sarebbe anche un po’ inutile..

    come non detto… grazie per la risposta!

  14. 3 Giugno 2010

    max_dl


    Davide:

    l’ideale sarebbe avere un risultato simile alle pagine web fatte dal plugin WPTouch ma il mio sito non è in wordpress… e poi vorrei proprio l’applicazione… o al massimo sapete come ottenere un sito in versione mobile come quello con wptouch?

    Ciao, qual’è il tuo sito? Com’è stato realizzato?

  15. 3 Giugno 2010

    Davide


    max_dl:


    Davide:

    l’ideale sarebbe avere un risultato simile alle pagine web fatte dal plugin WPTouch ma il mio sito non è in wordpress… e poi vorrei proprio l’applicazione… o al massimo sapete come ottenere un sito in versione mobile come quello con wptouch?

    Ciao, qual’è il tuo sito? Com’è stato realizzato?

    con un cms

  16. 12 Luglio 2010

    Fra

    Sarebbe utile un tutorial che non si basi su una Navigation Based App ma sua una View Based App…a me servirebbe molto! Se magari qualcuno mi dice come fare….Grazie mille

  17. 19 Luglio 2010

    Andrea Busi


    Fra:

    Sarebbe utile un tutorial che non si basi su una Navigation Based App ma sua una View Based App…a me servirebbe molto! Se magari qualcuno mi dice come fare….Grazie mille

    è la stessa identica cosa, solo che non setterai delle celle ma imposterai i valori o gli oggetti che ti servono..
    puoi fare tutto ciò, ad esempio, dal metodo “parserDidEndDocument” che viene richiamato quando il parser ha completato di esaminare il feed RSS 😉

  18. 14 Agosto 2010

    Fabio

    Ciao

    Sto utilizzando il vostro rss parser, ma sono incappato in un bel bug.

    Praticamente, il metodo

    (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    viene richiamato ogni volta che c’è uno scorrimento sulla tabella, infatti

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    permette di “generare” il contenuto dinamicamente(invocando ogni volta questo metodo), onde cosi evitare spreco di risorse.
    Il problema è che però, se noi scorriamo in basso, dopo l’ultima cella visibile, il metodo restituisce una casella che è già “popolata”.
    ti faccio un esempio
    supponiamo che la nostra vista principale visualizzi gli index da 0 a 11.
    scendo in basso e chiedo quindi gli index 12 e 13
    le celle 12 e 13 risultano diverse da null(!!!), e quindi visualizzo il contenuto(che è…la cella 0 e 1!)
    se torno sopra il problema non si ripropone poichè gli indici sono corretti. Suggerimenti? 🙂

  19. 14 Agosto 2010

    Fabio

    Auto-soluzione: il problema è l’identificatore di cella sempre uguale

    NSString *CellIdentifier = [NSString stringWithFormat:@”CellId%i”, indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    forse dovreste aggiornare il codice, visto che attualmente con un numero di feed maggiore di quello visualizzabile dalla prima view, il programma non funziona 😉

    Ciao!

  20. 17 Agosto 2010

    Lele

    Buongiorno, articolo interessante, vorrei farvi una domanda…come si potrebbe ruotare in landscape l’intera tabella? e se ho una UITableViewCell al posto di una UITableView come nell’articolo? La domanda e’ dovuta al fatto che nel mio lettore di rss uso la UITableViewCell per rendere graficamente piu’ bella l’app, solo che se ruoto verso destra la tabella ruota ma non va a pieno schermo, occupa solo la meta del landscape. grazie 🙂

  21. 23 Agosto 2010

    Fabio

    Ciao Lele, alla fine io sono riuscito a fargli fare il landscaping in maniera adeguata, ma ho dovuto seguire una procedura sconsigliata dalla apple.
    In questo modo:

    //
    // MyTabBarController.h
    //

    #import

    @interface MyTabBarController : UITabBarController {

    }

    @end

    // MyTabBarController.m
    //

    #import “MyTabBarController.h”

    @implementation MyTabBarController

    – (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    UIInterfaceOrientationPortrait);
    return (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ? NO : YES);

    }

    @end

    purtroppo seguendo le linee guida della apple non ci sono riuscito, c’era qualche sottoclasse che non restituiva YES

  22. 23 Agosto 2010

    Fabio

    p.s. scusami io ho usato anche una Tab Bar(che nell’esempio non c’è) 🙂

  23. 23 Agosto 2010

    Andrea Busi


    Fabio:

    Auto-soluzione: il problema è l’identificatore di cella sempre uguale

    NSString *CellIdentifier = [NSString stringWithFormat:@”CellId%i”, indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    forse dovreste aggiornare il codice, visto che attualmente con un numero di feed maggiore di quello visualizzabile dalla prima view, il programma non funziona ;-)

    Ciao!

    ciao, il tuo problema mi sembra strano.. io ho sempre utilizzato quel codice e non ho mai avuto problemi, tutte le celle visualizzano i dati correttamente, senza che vengano riprese delle celle già popolate..


    Lele:

    Buongiorno, articolo interessante, vorrei farvi una domanda…come si potrebbe ruotare in landscape l’intera tabella? e se ho una UITableViewCell al posto di una UITableView come nell’articolo? La domanda e’ dovuta al fatto che nel mio lettore di rss uso la UITableViewCell per rendere graficamente piu’ bella l’app, solo che se ruoto verso destra la tabella ruota ma non va a pieno schermo, occupa solo la meta del landscape. grazie :)

    mi pare di capire che il tuo problema dipenda dal fatto che hai utilizzato una UITableViewCell personalizzata.. non ho mai affrontato questo problema, però penso ci possano essere due soluzioni:
    1) ti crei una nuova UITableViewCell, da utilizzare quando l’applicazione passa in landscape, ottimizzata ovviamente per le dimensioni maggiori della cella
    2) adatti la cella che hai già in modo che funzioni anche in landscape.. ci sono delle opzioni in IB per fare ciò, però non so se funzionano anche per questo componente, non ho mai provato..

  24. 24 Agosto 2010

    App development per iOS, i tutorial - TheAppleLounge

    […] Build a simple Rss reader (ita). Ancora un tutorial molto valido (questa volta in italiano) sullo sviluppo di un RSS Reader basilare. Indispensabile per approfondire i concetti e le funzioni del pharser xml disponibile nell’ SDK. […]

  25. 2 Settembre 2010

    Ascot

    Ciao Andrea, mi sto avvicinando al mondo Mac (piu o meno da ieri) e ancora meglio allo sviluppo software, volevo chiederti una cosa, a te che sicuramente sei piu ferrato del sottoscritto.

    Aggiornando alla sdk 4.0 da problemi sul setDelegate:self, l’errore è
    ‘RootViewController’ does not implement the ‘NSXMLParserDelegate’ protocol

    qualcosa su internet l’ho trovato, ma sinceramente sono così inesperto su questo tipo di programmazione che nn so cosa modificare.

    Se puoi aiutarmi mi faresti un grande favore (odio lasciare le cose incomplete), Saluti

  26. 3 Settembre 2010

    creare un'app per una testata giornalistica - iPhone Italia Forum

    […] Creiamo il nostro lettore di feed RSS per iPhone SDK | devAPP […]

  27. 6 Settembre 2010

    Andrea Busi


    Ascot:

    Ciao Andrea, mi sto avvicinando al mondo Mac (piu o meno da ieri) e ancora meglio allo sviluppo software, volevo chiederti una cosa, a te che sicuramente sei piu ferrato del sottoscritto.

    Aggiornando alla sdk 4.0 da problemi sul setDelegate:self, l’errore è
    ‘RootViewController’ does not implement the ‘NSXMLParserDelegate’ protocol

    qualcosa su internet l’ho trovato, ma sinceramente sono così inesperto su questo tipo di programmazione che nn so cosa modificare.

    Se puoi aiutarmi mi faresti un grande favore (odio lasciare le cose incomplete), Saluti

    si, era un piccolo errore dovuto ad iOS 4.. Basta aggiungere il delegato come vedi nella dichiarazione del metodo..

    Grazie della segnalazione, ora il tutorial è corretto e funzionante 😉

  28. 18 Settembre 2010

    System

    Salve,
    qualcuno potrebbe darmi qualche idea su come fare la stessa applicazione però per iPad??
    Grazie in anticipo!

  29. 30 Settembre 2010

    algoritmo

    questo tutorial mi è stato davvero utile ma ho 2 richieste da farvi:

    1) l’elenco dei feed rss si vede ma il titolo è incompleto cioè è tutto su una riga invece io voglio che si legga in modo completo anche su diverse righe (che vada a capo automaticamente insomma). come si fa?

    2) ho bisogno di aggiungere una tab bar in basso per separare i feed in 2 sezioni (ad esempio “fisso” e “mobile”. dopo che l’aggiungo cosa devo fare? potete fare un tutorial simile ma spiegando anche come si aggiunge la tab bar?

    grazie!

  30. 1 Ottobre 2010

    Andrea Busi


    algoritmo:

    questo tutorial mi è stato davvero utile ma ho 2 richieste da farvi:

    1) l’elenco dei feed rss si vede ma il titolo è incompleto cioè è tutto su una riga invece io voglio che si legga in modo completo anche su diverse righe (che vada a capo automaticamente insomma). come si fa?

    2) ho bisogno di aggiungere una tab bar in basso per separare i feed in 2 sezioni (ad esempio “fisso” e “mobile”. dopo che l’aggiungo cosa devo fare? potete fare un tutorial simile ma spiegando anche come si aggiunge la tab bar?

    grazie!

    1) puoi provare a utilizzare questa istruzione:

    cell.textLabel. adjustsFontSizeToFitWidth = YES;

    dovrebbe ridurti la dimensione del testo fino a quando non è completamente visualizzato nella cella 😉

    2) un tutorial dedicato non penso che lo faremo, però per quanto riguarda l’utilizzo delle TabBar puoi guardare questi: http://www.devapp.it/wordpress/t010-usiamo-le-tab-bar.html

  31. 4 Ottobre 2010

    Personalizzare le Navigation Bar nelle nostre applicazion iPhone e iPad | devAPP

    […] Per il nostro scopo utilizziamo il semplice lettore di feed RSS che abbiamo creato utilizzando questo nostro tutorial. Scaricate il file di progetto ed apritelo in […]

  32. 7 Ottobre 2010

    algoritmo

    grazie per avermi risposto anche se non era quello che volevo. io voglio che la singola riga si allarghi in base al testo che viene preso da un tag xml, nel mio caso il titolo.

    seguendo il tutorial, le righe sono tutte della stessa ampiezza e il titolo non compare in modo completo ma ci sono i 3 puntini di sospensione. io voglio che vada a capo in automatico e che rientri tutti nella singola cell ma senza ridimensionare il carattere (anche perchè in questo modo è abbastanza brutto graficamente!)

    spero che mi possiate aiutare in qualche modo! grazie!

  33. 7 Ottobre 2010

    Andrea Busi


    algoritmo:

    grazie per avermi risposto anche se non era quello che volevo. io voglio che la singola riga si allarghi in base al testo che viene preso da un tag xml, nel mio caso il titolo.

    seguendo il tutorial, le righe sono tutte della stessa ampiezza e il titolo non compare in modo completo ma ci sono i 3 puntini di sospensione. io voglio che vada a capo in automatico e che rientri tutti nella singola cell ma senza ridimensionare il carattere (anche perchè in questo modo è abbastanza brutto graficamente!)

    spero che mi possiate aiutare in qualche modo! grazie!

    era come sospettavo xD
    l’unico modo per fare ciò è di utilizzare delle celle personalizzate. Al loro interno metterai una label che possa occupare due tre righe, in modo che il font non cambi e il testo vada a capo automaticamente..

    puoi trovare qualcosa di utile riguardo alle celle personalizzate in questo tutorial: http://www.devapp.it/wordpress/t050-creiamo-un-client-twitter-per-iphone-parte-2.html

  34. 18 Ottobre 2010

    Emiliano

    Ciao Andrea… sono riuscito quasi a far funzionare perfettamente il mio rss news… ho però un problema…parto dall inizio:
    1) Esce la griglia con i titoli di tutte le rss news…OK
    2) Clicco su una news e mi apre un’altra pagina fatta da me con all’interno il content:encoded dell news rss…OK
    3) all’interno del conten:encoded mi visualizza tutti i tag html…del tipo , ecc… come mai ???

  35. 4 Novembre 2010

    DAG

    Ciao a tutti,
    ho seguito alla lettera il tutorial e non ho avuto problemi, ma ora ho deciso di provare a metterci del mio.

    Vorrei sfruttare la base di questo tutorial per creare un catalogo prodotti (per un ipotetico sito di e-commerce) da installare su iPhone (non so a chi posa servire, ma a livello di studio torna utile a me); ho quindi modificato il file XML con i dettagli del prodotto (tra cui la URL dell’immagine).

    Per mostrare l’immagine ho pensato di usare:
    NSURL *url = [NSURL URLWithString:XXX];
    NSData *data = [NSData dataWithContentsOfURL:url];
    cell.imageView.image = [[UIImage init] imageWithData: data];

    Tutto bene se al posto di XXX metto (di seguito una URL fittizia):
    @”http://www.example.com/image.png”
    ma in questo modo tutte le righe avranno la stessa immagine!

    Se provo a sostuituire la URL statica con qualcosa tipo:
    [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@”immagine”]
    (dove immagine è il nome del nodo dell’XML che contiene la URL), l’immagine non compare.

    Le ho provate tutte (tutte quelle che un novellino può immaginare), ma senza successo.

    Qualcuno ha un’idea?

    Grazie a tutti!

  36. 5 Novembre 2010

    DAG

    Ho scoperto l’arcano mistero: bastave usare nel modo corretto il debugger.

    Il contenuto di
    [[elencoFeed objectAtIndex:indexPath.row] objectForKey:@”immagine”]
    andava pulito (come nel caso del link) dai caratteri speciali (spazio, tab e ritorni a capo).

    Infatti il path dell’immagine conteneva un ritorno a capo e due tabulazioni; tutto dovuto all’intentatura del file XML.

    Questo mi fa capire che il metodo di parsing utilizzato non va a leggere in modo ottimale i nodi dell’XML…

    Quindi TUTTO OK… Ora però passo as una UITableViewCell personalizzata.

  37. 9 Novembre 2010

    gianni

    ciao ho un piccolo problema,ovvero quando faccio il parsing di una serie di informazioni e tra di queste ci sono dei carattri speciali il parsing mi si blocca.
    come psso fare per risolvere?

  38. 25 Novembre 2010

    Maurizio

    Salve questo post mi è stato utilissimo per creare il mio lettore di Feeds. Ora però ho un problema: vorrei utilizzare la base di questo codice per fare il parsing di una pagina web in cui ci sono più tag uguali ma con campo “name” diverso. A me servirebbe salvare solo uno di questi. Qualcuno saprebbe aiutarmi? Spero di essere stato chiaro. Ciao

  39. 1 Dicembre 2010

    Andrea Busi


    gianni:

    ciao ho un piccolo problema,ovvero quando faccio il parsing di una serie di informazioni e tra di queste ci sono dei carattri speciali il parsing mi si blocca.
    come psso fare per risolvere?

    ciao, strano come problema. O meglio, strano che si blocchi, dovrebbe leggerlo e magari convertirlo in modo errato.. Riesci a postare un esempio?

  40. 12 Dicembre 2010

    Dario

    Modificando l’url e leggendo i tag da un altro xml, qual è la forma corretta per la composizione della pagna che restituisce un contenuto in formato xml?

    intestazione encoding
    tag radice
    tag1
    tag2
    ecc…

    Oppure è necessario includere il link ad uno schema?
    Grazie mille
    dario

  41. 3 Gennaio 2011

    Aggiungere il tasto "aggiorna" nel lettore Feed iPhone o iPad | devAPP

    […] crearne uno tutto vostro in pochi minuti, seguendo il nostro tutorial a cura di Andrea Busi al seguente indirizzo. Eccovi un piccolo screenshot che mostra il pulsante che andremo a […]

  42. 8 Gennaio 2011

    salvo


    System:

    Salve,
    qualcuno potrebbe darmi qualche idea su come fare la stessa applicazione però per iPad??
    Grazie in anticipo!

    mi associo: sto provando il tutorial in un progetto universal che già contiene una tabella (con un pulsante “RSS” deve caricare gli RSS al posto dei link della precedente tabella), con iPhone funziona tutto (push della nuova tabella, ecc…), ma con iPad e il suo splitView no: non posso fare il push, altrimenti poi carica i link nella parte sinistra (rootController), risesco a caricare la tabella ma poi i link nella parte destra (detailView) non vengono aperti…
    Idee?

    ciao
    salvo

  43. 16 Gennaio 2011

    Sagitter

    Salve, ho un piccolo problema: il feed che sto cercando di parsare (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) contiene tutti gli stessi tag “Cube” e i dati sono identificati con degli attributi, come faccio ad estrarli?

    Grazie

  44. 24 Gennaio 2011

    Narsus

    Ciao, quesito interessante:
    qual’è secondo te il modo migliore per presentare all’utente il contenuto di “currentSummary” (il tag del file XML), il contenuto è già formattato in HTML, è possibile visualizzarlo nella UIWebView?? Grazie! Sei un grande!
    Andrea

  45. 28 Gennaio 2011

    Mat

    Salve questo post mi è stato utilissimo per creare il mio lettore di Feeds. Ora però ho un problema: vorrei utilizzare la base di questo codice per fare il parsing di una pagina web in cui ci sono più tag uguali ma con campo “name” diverso. A me servirebbe salvare solo uno di questi. Qualcuno saprebbe aiutarmi? Spero di essere stato chiaro. Ciao

    Anche io dovrei risolvere lo stesso problema. Ho un rss con due nodi con lo stesso nome ma dovrei leggere solo il primo perchè il secondo contiene dati diversi. Avete qualche suggerimento?? Grazie

  46. 7 Febbraio 2011

    riccardo

    E’ possibile leggere dati da un file xml disponibile su un pc in rete wi-fi ? Mi spiego meglio, invece di compilare all’interno della soluzione il mio file xml, lo posso caricare al momento dell’esecuzione da un percorso di rete ?

    Grazie

  47. 25 Febbraio 2011

    Mario

    Ciao, molto interessante il tutorial.. mi stò cimentando da pochissimo come apple developer ma conoscevo la programmazione già da un pò…
    ho una domanda ma se uno volesse inserire un tasto per dei contenuti di tipo Video.. oltre hai feed SRR di news voglio creare una sezione video… come si potrebbe creare?
    Ciao e ancora complimenti!

  48. 28 Marzo 2011

    Andrea Busi


    riccardo:

    E’ possibile leggere dati da un file xml disponibile su un pc in rete wi-fi ? Mi spiego meglio, invece di compilare all’interno della soluzione il mio file xml, lo posso caricare al momento dell’esecuzione da un percorso di rete ?

    Grazie

    se specifichi un indirizzo HTTP del file valido dovrebbe funzionare senza problemi..


    Mario:

    Ciao, molto interessante il tutorial.. mi stò cimentando da pochissimo come apple developer ma conoscevo la programmazione già da un pò…
    ho una domanda ma se uno volesse inserire un tasto per dei contenuti di tipo Video.. oltre hai feed SRR di news voglio creare una sezione video… come si potrebbe creare?
    Ciao e ancora complimenti!

    hai due soluzioni:
    a) ti crei due feed RSS diversi, uno per i dati e l’altro per i video
    b) utilizzi dei marcatori diversi, che poi vai ad interpretare correttamente al momento del parsing

  49. 7 Aprile 2011

    Andrea

    Ciao Andrea, ho comprato anche il tuo libro, ma adattando questo esempio ad una mia applicazione ho riscontrato un problema su qesta linea

    [rssParser setDelegate:self];

    mi da Semantic Issue ec.. ec.. (ora sono in ufficio stasera posto lo warning completo)

  50. 12 Aprile 2011

    Andrea Busi


    Andrea:

    Ciao Andrea, ho comprato anche il tuo libro, ma adattando questo esempio ad una mia applicazione ho riscontrato un problema su qesta linea

    [rssParser setDelegate:self];

    mi da Semantic Issue ec.. ec.. (ora sono in ufficio stasera posto lo warning completo)

    detto così non riesco a capire che errore possa essere, appena riesci a postare l’errore completo lo analizziamo 😉

Newer Comments »

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO