Come promesso nel precedente tutorial, creeremo oggi un client iOS utilizzando le grandi novità di iOS5, utilizzeremo infatti sia ARC che Storyboard.
Iniziamo creando un nuovo progetto di tipo “Empty application”. Potremmo selezionare anche “Master-detail Application”, ma ci troveremmo troppa pappa pronta e questo non va bene.

Chiamiamo il progetto JSClient e assicuriamoci di aver selezionato “iPhone” e “Use automatic reference counting” come mostrato in foto:

L’applicazione in questo momento è veramente vuota per cui bisogna aggiungere almeno un file storyboard, aggiungiamolo cliccando su file->new file e selezionando la voce “storyboard”:

Attenzione a selezionare iPhone come Device Family.
Dobbiamo ora fare in modo che l’app utilizzi questo file per caricare l’interfaccia e per far ciò selezioniamo l’icona del progetto in alto a sinistra e scegliamo il corretto storyboard dalla combobox Main Storyboard:

C’è un’altra modifica da effettuare affiché venga correttamente utilizzato lo storyboard e consiste nell’eliminare il contenuto del metodo:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Nell’appdelegate, assicuratevi semplicemente di mantenere un:
return TRUE;
Possiamo passare alla creazione dell’interfaccia dentro lo storyboard. Se non l’avete mai utilizzato potete farvi un’idea leggendo l’articolo Introduzione a Storyboard.
Trasciniamo sullo storyboard un UITableViewController e scegliamo “embed in-> navigation controller” dal menù Editor, otterremo questo risultato:

Come abbiamo già detto nel precedente articolo, abbiamo trascinato un generico tableViewController, ma a noi serve una nostra classe che erediti da tableViewController, aggiungiamo quindi un nuovo file al progetto (sempre file->new file) selezionando la voce UIViewController Subclass e scegliendo infine UITableViewController dalla combobox SubClass of:
.A questo punto possiamo specificare all’interno del file storyboard che il tableviewcontroller non è un generico tableviewcontroller, ma una istanza dell’appena inserito MainTableViewController.
Selezioniamolo quindi all’interno del file storyboard e settiamone correttamente la proprietà custom class come mostrato nello screenshot:

Vogliamo che selezionando un contatto dalla tabella venga visualizzata una view con i dettagli di quel contatto. Per questo ci servirà un secondo viewController. Trasciniamo quindi nello storyboard un viewController standard e trasciniamo dalla cella del tableViewController verso il viewController appena creato e selezioniamo “push” dal menù che viene visualizzato. Questo sarà il risultato:

Anche in questo caso abbiamo usato un generico viewController, ma in realtà ci servirà uno specifico viewController, aggiungiamolo quindi da file->new file e poi modifichiamo lo storyboard affinché rispecchi la nuova classe, allo stesso modo di come abbiamo fatto poco fa con il MainTableViewController.
Ci serviranno 4 textField per visualizzare i dettagli del contatto selezionato e per fare ciò sfruttiamo una comoda funzionalità del nuovo XCode, apriamo lo storiboard e trasciniamo 4 textfield sul viewcontroller, selezioniamo la visualizzazione dell’assistant editor e trasciniamo dalle textfield verso l’intestazione della classe:

In questo modo verranno automaticamente create le quattro property necessarie per accedere alle textfield.
Realizzazione della logica applicativa
Possiamo passare ora a realizzare la parte di logica del programma che ci permetterà di scaricare il JSON dal nostro server e visualizzare i contatti nella tabella.
Apriamo il file MainTableViewController e aggiungiamo un’array come variabile di istanza dove memorizzare tutti i contatti:
@property (nonatomic, strong) NSArray *contatti;
non dimentichiamoci:
@synthesize contatti;
nel file MainTableViewController.m.
All’interno del metodo viewDidLoad occupiamoci di interrogare il server per ottenere il JSON, ma non lo faremo nel thread principale, useremo invece il gran central dispatcher per eseguire il download in background. Modifichiamo quindi il metodo in questo modo:
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost:8888"]];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES]; });
}
Come potete notare dopo aver scaricato il JSON ed averlo memorizzato all’interno dell’oggetto data richiamiamo fetchedData, che si occuperà di effettuare il parsing.
Il metodo è questo:
- (void)fetchedData:(NSData *)responseData {
NSArray* json = [NSJSONSerialization
JSONObjectWithData:responseData //1
options:kNilOptions error:nil];
self.contatti = json;
[self.tableView reloadData];
}
Tutta la magia avviene grazie alla classe NSJSONSerialization ed al suo metodo JSONObjectWithData:options:error che si occupa di parsare il JSON e restituire un array di dizionari. Fin troppo semplice, non credete?
Infatti ci tocca complicare un po’ le cose ed adesso vediamo insieme il perché.
Con i due metodi precedenti abbiamo interrogato un webservice e ricevuto un JSON contenente una lista di contatti e, una volta ricevuta tale lista, abbiamo inserito in un array tanti oggetti NSDictionary quanti sono i contatti ricevuti. Ma l’oggetto NSDictionary è un tipo generico non è una nostra classe il che porta (magari non in questo esempio, ma di sicuro nella vita reale) ad avere diversi problemi durante la stesura del progetto. Vediamo quali sono i pregi derivanti dall’utilizzo di una classe:
- le variabili di istanza hanno dei nomi fissi che possiamo controllare nell’header della classe
- le variabili di istanza possono essere incapsulate dai metodi get e set
- Il nostro codice sarebbe più facile da leggere perché un oggetto di tipo Contatto è più identificabile di un generico NSDictionary
- Possiamo aggiungere metodi specifici che non sono previsti in un NSDictionary
- …la lista potrebbe continuare…
Sperando di avervi convinto creiamo subito la classe “Contatto” (file->new file->NSObject subclass) che ha semplicemente 4 proprietà di tipo NSString, non credo ci sia bisogno di particolari istruzioni, qui c’è il codice completo:
Questo è il file Contatto.h
#import
@interface Contatto : NSObject
@property (strong, nonatomic) NSString *nome;
@property (strong, nonatomic) NSString *cognome;
@property (strong, nonatomic) NSString *dataNascita;
@property (strong, nonatomic) NSString *sesso;
@end
e questo è il file Contatto.m
#import "Contatto.h"
@implementation Contatto
@synthesize nome,cognome,dataNascita,sesso;
@end
Creata la nostra classe possiamo aggiungere un #import Contatto in cima al file MainTableViewController.h e modificare il metodo fetchedData: in questo modo:
- (void)fetchedData:(NSData *)responseData {
NSArray* json = [NSJSONSerialization
JSONObjectWithData:responseData //1
options:kNilOptions error:nil];
NSMutableArray *contattiTMP = [[NSMutableArray alloc] initWithCapacity:[json count]]; //2
for (NSDictionary *dict in json) { //3
Contatto *c = [[Contatto alloc] init]; //4
c.nome = [dict objectForKey:@"nome"];
c.cognome = [dict objectForKey:@"cognome"];
c.dataNascita = [dict objectForKey:@"datanascita"];
c.sesso = [dict objectForKey:@"sesso"];
[contattiTMP addObject:c]; //5
}
//mi assicuro che l'array contatti non possa essere modificato.
self.contatti = [contattiTMP copy]; //6
[self.tableView reloadData];
}
- Il parser dell’oggetto responseData è rimasto uguale al precedente, quindi nessun cambiamento
- Dichiariamo e inizializziamo un NSMutablearray, ci servirà per memorizzare le istanze della classe Contatti
- Eseguo un ciclo for su tutti gli oggetti dell’array restituito dal parser JSON
- Per ogni iterazione creo un nuovo oggetto di tipo Contatto e ne imposto le proprietà leggendole dal dizionario.
- Infine aggiungo il Contatto all’array
- Terminata la procedura di creazione dei contatti assegno alla variabile di istanza contatti una copia dell’NSMutableArray creato al punto 2, questo perché ho scelto che tale variabile sia immutabile e quindi non voglio assegnargli un NSMutableArray.
Passiamo ora ai metodi relativi alla tabella:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [contatti count];
}
- (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];
}
cell.textLabel.text = [[contatti objectAtIndex:indexPath.row] nome];
// Configure the cell...
return cell;
}
e lanciamo l’applicazione. Il risultato sarà questo:

La gestione della tabella è già stata trattata in molti altri articoli, ed in questo caso non presenta nessuna particolarità, se avete dei dubbi non esitate a chiedere.
Passiamo alla visualizzazione del dettaglio. Vogliamo fare in modo che cliccando su una cella “Mario” vengano visualizzati i dati dell’utente “Mario”. Se avete seguito correttamente la parte di questo articolo relativa alla costruzione dello storyboard dovreste già poter cliccare sulla cella e vedere il viewcontroller di dettaglio, che però è vuoto. Vuoto perché nessuno gli ha detto che dati visualizzare!
Il metodo che dobbiamo implementare per avere il controllo del viewcontroller di dettaglio è questo:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; //1
Contatto *c = [self.contatti objectAtIndex:indexPath.row]; //2
DetailViewController *dvc = (DetailViewController *)[segue destinationViewController]; //3
}
- Otteniamo l’indexpath della cella che è stata selezionata
- Recuperiamo l’oggetto Contatto dall’array usando l’indexPath
- Recuperiamo l’istanza del viewcontroller di dettaglio usando il metodo destinationViewController
A questo punto abbiamo il riferimento al viewControlle di dettaglio ed un approccio “poco lungimirante” (eufemismo) potrebbe essere quello di impostare direttamente il valore delle textField con i valori prelevati dall’oggetto Contatto… Questo non è un buon approccio perché nell’ottica di separare quanto è possibile logiche e responsabilità dobbiamo prevedere la possibilità che DetailViewController venga modificato, per esempio, usando una webView piuttosto che quattro textField, se usassimo l’approccio “poco lungimirante” ciascuna modifica, anche minima, alla classe DetailViewController dovrebbe propagarsi anche alla classe MainTableViewController e di sicuro non è quello che vogliamo (in inglese di parla di “coupling” e “de-coupling” spero di aver dato l’idea del loro significato).
In questo caso quindi che facciamo? Basta ragionare un’attimo sullo scopo principale per il quale abbiamo creato la classe DetailViewController, che è quello di visualizzare i dettagli di uno specifico Contatto.
Allora di cosa ha bisogno per poter assolvere al suo compito? Beh, a bisogno che qualcuno gli dica quale contatto visualizzare, no?
Quindi modifichiamo il metodo precedente aggiungendo proprio il passaggio dell’oggetto Contatto:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
Contatto *c = [self.contatti objectAtIndex:indexPath.row];
DetailViewController *dvc = (DetailViewController *)[segue destinationViewController];
[dvc setContatto:c]; //4
}
Al punto 4 vi darà errore perché ancora la classe DetailViewController non ha alcun metodo setContatto. Lo aggiungeremo adesso.
Selezioniamo il file DetailViewController.h aggiungiamo #import “Contatto.h” in cima al file e una property di tipo Contatto:
@property (strong, nonatomic) Contatto *contatto;
Nel file DetailViewController.m non dimentichiamoci di aggiungere @syntetize contatto.
Possiamo ora modificare il metodo viewdidLoad in modo da visualizzare correttamente i dettagli del contatto:
- (void)viewDidLoad
{
self.nome.text = contatto.nome;
self.cognome.text = contatto.cognome;
self.datanascita.text = contatto.dataNascita;
self.sesso.text = contatto.sesso;
[super viewDidLoad];
}
Ammiriamo finalmente il nostro programma in tutto il suo splendore! 🙂

E adesso?
Se avete seguito per intero questo lungo tutorial avrete notato che abbiamo messo veramente tanta carne al fuoco, quindi sta a voi capire che cosa approfondire.
Se vi interessa la parte web potreste trovare utile approfondire il php (Corso php w3c) o perché no uno dei tanti framework per lo sviluppo in questo linguaggio come simfony o codeigniter.
Questi framework utilizzano un’approccio diverso al database rispetto all’esempio qui proposto, ma un buon programmatore non può esimersi dal conoscere almeno un pò il linguaggio SQL (Corso SQL w3c).
Se invece siete più interessati alla parte iOS date un’occhiata a questo articolo (JSON Benchmark) in cui viene eseguito un benchmark sui vari framework per effettuare il parsing di un JSON, purtroppo scopriremo che il metodo usato qui non è il più veloce in assoluto (anche se si guadagna un onorevole secondo posto).
Non mi resta che darvi il link del progetto completo, lo trovate su github a questo indirizzo: JSClient ed augurare a tutti buona programmazione!









86 Responses to “T#106 – JSON e iOS 5: creiamo il client iPhone per il nostro web service PHP (Parte 2)”
12 Settembre 2012
Aste non si può utilizzare un metodo asincrono?
oppure volendo inserire un activity indicator?
12 Settembre 2012
ignaziocactivity indicator non mostra la progressione…anche l’HUD se vuoi mettere solo la rotellina che gira va bene…quello che non hai è la percentuale di download, per avere quella devi usare nsurlconnection
12 Settembre 2012
Astmi sa che siete stati inseriti in black list da google…quando provi ad entrare sul sito viene fuori un messaggio terroristico che dice “attenzione il sito http://www.devapp.it è pericoloso e diffonde malware”…o qualcosa del genere…
13 Settembre 2012
FedericoCiao a tutti! altra domanda: ho seguito il tutorial su JSON per reperire un elenco di aziende da web. è possibile (senza stravolgere l’app che funziona alla grande) mostrare ora i risultati organizzati per regione/provincia?
in particolare come il terzo esempio che riporto qui https://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html
contando che da JSON prendo tutti i dati azienda, compresa regione e provincia, come posso procedere per raggruppare in un secondo tempo i dati raccolti, evitando allo stesso tempo di agire in modo statico (con una query per ogni regione/provincia)?
grazie
25 Settembre 2012
mattiaciao scusa potresti fare il tutoial anche per ipad con le splitview perfavore..?
grazie in anticipo
28 Settembre 2012
JackRagazzi ma solo a me la guida da l’errore SIGABRT su questo script?
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
Anche se compilo dal progetto del tutorial direttamente…ho xcode 4.5
24 Ottobre 2012
camillo@Jack controlla se è corretto l’indirizzo web da dove prendi il file Json.
26 Ottobre 2012
camilloHo provato il tutoria ma sto avendo una difficoltà , al passo in cui dici “La gestione della tabella è già stata trattata in molti altri articoli, ed in questo caso non presenta nessuna particolarità, se avete dei dubbi non esitate a chiedere.” hai caricato l’immagine dell’emulatore e ti da la la possibilità di cliccare sulle frecce per “vedere i dettagli” mentre a me non mi da questa possibilità mi da solo l’elenco.
Ho continuato la guida fino in fondo ma non riesco a tirare fuori questi dettagli…
Hai qualche suggerimento da darmi su dove posso sbagliare?
Io sto usando iOS6 e l’ultimo Xcode..
19 Novembre 2012
GiacomoHo trovato questo tutorial molto interessante!! Vorrei chiedervi una coda, come potrei fare se volessi inserire una query con una condizione where? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@”http://localhost:8888″]];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES]; });
Come posso riadattarlo affinchè possa usare il metodo POST?:)
7 Marzo 2013
AlexE se invece di utilizzare un Text Field volessi utilizzare un Text View che cosa dovrei modificare?
20 Aprile 2013
LorenzoSe non ho capito bene mi scuso ma in questo tutorial si mostra soltanto come visualizzare i dati di un database, ma se io volessi inserirli da applicazione sapete dirmi cosa dovrei fare?
23 Aprile 2013
ignaziocPer inserirli fai una post ad uno script php che si occupa di inserire i dati nel database.
26 Aprile 2013
mdjaxxciao Ignazio,intanto bravissimi …siete diventati il mio punto di riferimento del web … sono da poco sviluppatore ios .. sonno affascinato .. e sto facendo la mia prima applicazione . è per un dj… ho seguito con entusiasmo e li avrò visti e studiati decine e decine do volte… questi dui tutoria…… e funziona perfettamente con MAMP volevo testare la mia app con un server esterno.. ho e provarla finalmente sul mio iphone e ipad….ho trovato “db4free.net” è gratis.. (se tu conosci qualche altra soluzione per favore puoi comunicarmela )per cortesia mi dici cosa devo modificare nel index.php
domande:
1) dove salvo(upload) il file index.php (io ho anche hosting su aruba e su joomla( posso usare ftp)
2) nell applicazione (xcode)che script dell’url scrivo? invece che(http://localhost:8888)
ignazio scusa se le domande sono da principiante .. ma per me è importantissimo risolvere e crearmi questo strumento di lavoro fondamentale per le app. anche future.
e volevo approfittare per chiederti se mi posti anche le modifiche per la view detail io avrei bisogno di visualizzare un immagine e un testo multirighe ,praticamente nella tableview iniziale il titolo del nuovo disco invece che il nome e nei detail la copertina del disco con i dettagli scritti invece che cognome ,sesso etc.
Ignazio te ne sarei veramente grato……grazieee!!!!!
Mario
26 Aprile 2013
Ignaziocio in genere quando ho bisogno di hostin mi rivolgo a netsons (http://goo.gl/1930z) che per 18 euro l’anno hanno un servizio di tutto rispetto.
L’index lo devi caricare sul tuo hosting.
invece che localhost sarà il nome del dominio che hai comprato tipo http://www.vattelappesca.com
Le modifiche della view detail te le lascio come esercizio 🙂 hai già il tutorial se devo farti tutto il programma io tu come ti diverti? 😀 😀
26 Aprile 2013
mdjaxxciao Ignazio, intanto grazie per avermi risposto!!
….scusami non ho capito bene ..quindi tu dici di usare netsons come hosting dominio e databae o usare netsons solo come hosting dominio e il database “db4free.net” …certo sarebbe interessante se netsons permettesse connesione remote anche perchè sinceramente “db4free.net” è gratis ma molto precario ..difatti la mia domanda “dove caricare l index.php nasceva dal fatto che “db4free.net” da solo la possibilità di connessione ma non ha spazio per uppare file,
cmq sei un grande!! mi stai facendo “intrippare” scusami ma purtoppo la mia voglia di imparare e tantissima…. allora ci provo:
per la index da caricarla su : http://www.vattelapesca.com/index.php (poi non so se bisogna caricarla in una determinata cartella ..per permessi etc.)
per quanto riguarda la view datai:
allora tecnicamente credo possa arrivarci purtroppo non ho molta conoscienza del objective c :
prima di tutto io ceerei un altro campo sulle tabella del db e la chiamerei (image_cover.jpg -come valore inserirei tutto l’ url dove andarla a pescare quindi http://www.vattelapesca.com/images/cover.jpg) dal lato php estraggo anche quel campo , dal lato xcode la recupererei in una variabile e poi la inserirei nella imageview nella detail view ..maestro che dici?
ti ringrazio anticipatamente!!
aspetto prima questa tua risposta per capire un attimo .cioe ripeto non ho capito se comprando un hosting su netsons con 18 eurol’anno ho sia il dominio che db mysql con possibilità connessione remota e quindi sarei apposto, oppure se comprando hosting su NETSONS ho comunque poi bisogno di un database esterno:):) .. ti ringrazio anticipatamente!
non vedo lOra di provare l app sul iphone!!:):)!
Mario.
ci provo he..
26 Aprile 2013
Ignazioc– esiste un forum su questo sito, usiamolo –
cmq la risposta è si, con un domino da netsons da 18 euro hai sia spazio che database.
per la detailView il ragionamento è corretto, anche se poi ovviamente c’è da scaricare l’immagine visto che hai solo l’url.
26 Aprile 2013
mdjaxxgrazie!!
a ok la prossima posto sul forum:)
siccome riguardava questo tutorial pensavo che fosse giusto così ..scusa!
Maestro mi metto subito al lavoro ..compro un dominio e provo a modificare i codici poi ti faccio sapere .
ciaooo e grazie!
Mario
30 Aprile 2013
LukeCiao a tutti,
ottimo tutorial. Ho applicato la stessa metodologia per popolare una mapView.
Effettuo il parser del Json, ottengo i dati di longitudine e latitudine, titolo e sottotitolo e visualizzo sulla mappa i pin.
Adesso vorrei passare i dati presenti nell’array ad una view dettagli che mi appare quando clicco il button azzurro dello showDetails.
Ovviamente indexPath.row in questo caso non funziona perchè non si tratta di una UITableView. Come posso fare?
Grazie mille
30 Aprile 2013
Ignaziocil mapviewdelegate ha un metodo che viene invocato al tap sul disclousurebutton
1 Maggio 2013
sp1d3r939ma come mai se effettuo il fetch di anche solo 20 dati nella tabella lo scroll scatta vistosamente? qualcuno può aiutarmi?
1 Maggio 2013
Ignaziocscrivi sul forum e posta un po’ di codice.
1 Maggio 2013
Lukeciao Ignazioc, ho scritto sul forum, ho trovato un topic che parla della stessa cosa a cui però non è mai stata data una soluzione. Spero che qualcuno possa darmi un input per capire come gestire il tutto con la MapView. Grazie mille. ciao
1 Maggio 2013
ignaziocio dicevo a @sp1d3r939
Per gestire tutto con la mappa come ti ho già detto hai il metodo
– (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
24 Giugno 2013
davids01Innanzitutto complimenti per il forum. Ho una domanda:
Nella lista oltre ad avere il nome voglio avere una immagine, il nomed ed una descrizione….cosa devo aggiungere?
Inoltre quando clicchiamo su di una voce di una lista ed entriamo della pagina dei dettaglia dovrei prendere i dati da un altro indirizzo web inviando tramite il metodo post l’id della voce che è stato cliccato, come devo fare?
Scusami forse saranno domande stupide ma sono un neofita del mondo objective c.
Grazie e complimenti!!!!
12 Ottobre 2013
MarcoCiao, intanto grazie per la guida.
seguendo la tua guida ho creato una pagina principale dalla quale carico i nominativi, funziona perfettamente, ma come posso fare per tornare alla pagina principale (prima del caricamento della uitableview)????
ho gia provato con i classici metodi, ma l’applicazione mi da questo tipo di errore
Thread 1:signal SIGABRT
su questa riga dell’appdelegate nella cartella json
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
Grazie in anticipo
12 Ottobre 2013
Ignaziocdevi agire sul navigationcontroller, qualcosa come [self.navigationcontroller poptoRootViewController];
13 Ottobre 2013
MarcoScusami ti sai spiegare meglio non ho capito
grazie
13 Ottobre 2013
Ignazioc“spiegarmi meglio” ? la spiegazione è chiarissima magari sei tu che sei alle prime armi e non hai ancora acquisito la terminologia adatta.
Prova a postare sul forum.
13 Dicembre 2013
steradixBel tutorial ma non capisco una cosa; seguo alla lettera i tuoi passaggi ma quando lancio la simulazione crasha con questo messaggio: Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘data parameter is nil.
Cosa significa??
27 Marzo 2014
LucaGrazie mille per l’ottimo tutorial Ignazio.
Oggi riesco ad apprezzarne l’utilità.
Luca
11 Maggio 2014
viciosarebbe possibile, cortesemente, avere la medesima guida per android?
3 Giugno 2014
ClaudioCome si fa ad implementerà un messaggio di errore tipo alertview se il dispositivo non fosse connesso a internet nel caso json si possa connettere … Grazie
13 Giugno 2014
micheleciao ignazio complimenti per la spiegazione dell’app
volevo chiederti una cosa:
nel database di phpmyadmin
ho inserto 1000 righe ma non mi ritorna il file json
se invece ne elimino 500 quindi ne restano 500
ritorna il file.
Come Mai? Troppo Pesante?
Grazie Mille
8 Luglio 2014
Fernandocella.textLabel.text =[[menu objectAtIndex:indexPath.row] category];
con questo parametro inserisco un text nella cella, ma se io volesse includere anche un immagine, sono proprio in altomare non so proprio come fare…
8 Luglio 2014
FernandoL’immagine la recupero da una cartella nel server, per quello dovrei leggere dal file json una stringa URL…
18 Luglio 2014
FernandoQualche idea????