Utover Grunnleggende om JSONModel

I min forrige artikkel lærte du om grunnleggende om JSONModel. Du så hvor lett det er å jobbe med JSON ved hjelp av JSONModel og hvordan det gjør mye for deg bak kulissene, for eksempel data validering og konvertering.

I denne opplæringen vil du opprette et mer komplekst program, og du vil lære om en rekke funksjoner som gir enda mer kraft til modellklassene dine.

Ved slutten av denne artikkelen har du opprettet en Flickr-nettleser for iOS. Søknaden vil snakke med Flickrs JSON API og vise en samling bilder jeg lastet opp til Flickr for denne opplæringen.

Du vil lære hvordan:

  • behandle komplekse API-responser
  • bruk JSONModels datatransformasjoner for URL og datoer
  • kart JSON-taster til egenskaper med forskjellige navn
  • Lag egendefinerte datakonverteringer
  • forhåndsbehandle API-svar før de blir analysert

Den ferdige Flickr-nettleseren vil se slik ut:

1. Prosjektoppsett

Fordi vi vil fokusere på å lære om JSONModels funksjoner, vil jeg gjerne starte med å starte med et grunnleggende prosjekt. Du finner prosjektet i kildefilene i denne opplæringen.

Åpne Xcode-prosjektet og ta et øyeblikk for å inspisere innholdet. Prosjektet har et enkelt oppsett, en enkelt bordvisningskontroller som viser en tom tabellvisning. Jeg har også tatt med to biblioteker i prosjektet, JSONModel og SDWebImage.

Bygg og kjør prosjektet for å sikre at prosjektet samles uten feil.

2. Svarmodell

La oss ta en titt på Flickrs offentlige bildefeed. Åpne API-endepunktet i nettleseren din og ta et øyeblikk for å inspisere svaret. Svaret inneholder bare noen få toppnøkler, for eksempel tittel og modifisert. Det er også en nøkkel kalt elementer inneholder en liste over fotobjekter hver med a tittel, link, beskrivelse, etc.

I følgende skjermbilde har jeg uthevet ett av disse bildeobjektene i elementer array for å hjelpe deg med å finne ut sine egenskaper.

La oss begynne med å lage en modellklasse for svaret på det offentlige fotofôret. Opprett en ny klasse i Xcode, navn den PublicPhotosModel, og gjør det arv fra JSONModel. Du er interessert i tittel og modifisert nøkler til JSON-responsen, så legg til to egenskaper med de samme navnene til grensesnittet til PublicPhotoModel klasse. Du vil også hente utvalget av bilder og lagre dem i en eiendom vi skal nevne elementer. Angi typen av elementer eiendom til NSArray som vist under.

#import "JSONModel.h" @interface PublicPhotosModel: JSONModel @property (copy, nonatomic) NSString * tittel; @property (sterk, ikke-atomisk) NSDate * modifisert; @property (strong, nonatomic) NSArray * elementer; @slutt

I dette eksemplet bruker du en av de innebygde datatransformatorene til JSONModel. Når du har en dato i ditt JSON-svar som følger W3C-formatet, kan du deklarere den tilhørende modellegenskapen av typen NSDate og JSONModel vil vite hva du skal gjøre.

Din grunnleggende modellklasse for å hente JSON-data fra Flickr API er klar. La oss koble den til tabellvisningen i visningskontrollen din. Du vil bruke elementer array i modellobjektet ditt, som representerer responsen til Flickr API, som datakilde for tabellvisningen.

Merk: Du lurer kanskje på hvordan du konverterer datoer hvis de ikke overholder W3C-standarden, eller hvis JSON-responsen inkluderer tidsstempler. Fortsett å lese. Før slutten av denne opplæringen, vet du hvordan du forvandler en verdi til et objektiv-objekt.

3. Henter JSON fra Flickr API

Begynn med å åpne ViewController.m og under den eksisterende importoppstillingen legger du til en importerklæring for modellklassen vi nettopp har opprettet:

#import "PublicPhotosModel.h"

Deretter erklære en privat eiendom for å lagre PublicPhotosModel eksempel bruker vi:

@interface ViewController () @property (sterk, ikkeatomisk) PublicPhotosModel * photosModel; @slutt

Du henter JSON-dataene ved hjelp av en hjelpemetode, fetchPhotos, som vi skal gjennomføre innen kort tid. Vi påberoper fetchPhotos i visningsregulatorens viewDidLoad metode:

- (void) viewDidLoad [super viewDidLoad]; // Hent bilder [selvbildefotografier]; 

I fetchPhotos, vi bruker NSURLSession-klassen til å spørre Flickr API som du kan se nedenfor:

- (void) fetchPhotos NSURL * photosURL = [NSURL URLWithString: @ "http://api.flickr.com/services/feeds/photos_public.gne?id=46760712@N07&lang=en-us&format=json&nojsoncallback=1"]; [[[NSURLSession sharedSession] dataTaskWithURL: photosURL completionHandler: ^ (NSData * data, NSURLResponse * respons, NSError * feil) // Process Data] CV]; 

Gjennomføringen er ganske lik det du skrev i forrige artikkel om JSONModel. Du erklærer deg først photosURL, som inneholder nettadressen til en bestemt feed av bilder på Flickr, og deretter opprett og brann a NSURLSessionDataTask eksempel for å hente listen over bilder av den aktuelle feeden.

Merk: Hvis du har en Flickr-konto og kjenner din Flickr-ID, kan du gjerne inkludere den i forespørselsadressen for å få programmet til å hente din egen feed av bilder.

Hvis du har lest den første artikkelen på JSONModel, vet du allerede hvordan du skal slå på NSData objekt, returnert av dataoppgaven, til en JSONModel gjenstand. Flickr returnerer imidlertid ikke alltid et gyldig JSON-svar. Med andre ord, må du gjøre litt forhåndsbehandling før du lager din modellobjekt.

Flickr API har en spesiell trekk som unnslipper enkle anførselstegn i JSON-responsen. Problemet er at dette gjør JSON-svaret ugyldig i henhold til gjeldende standarder, og som et resultat av dette NSJSONSerialization API kan ikke behandle det.

For å fikse dette, trenger du bare å fjerne de rømte enkeltnotene i JSON-responsen. Du kan da sikkert opprette modellobjektet ditt. Erstatte // Prosessdata med følgende utdrag:

NSString * rawJSON = [[NSString allokere] initWithData: datakoding: NSUTF8StringEncoding]; rawJSON = [rawJSON stringByReplacingOccurrencesOfString: @ "\\ 'withString: @"' "]; self.photosModel = [[PublicPhotosModel alloc] initWithString: rawJSON feil: null]; dispatch_async (dispatch_get_main_queue (), ^ self.title = self.photosModel.title; [self.tableView reloadData];);

Du begynner med å opprette en NSString objekt fra NSData for eksempel datataken returnerer til deg. Det er trygt å anta at teksten er UTF8 kodet siden Flickr bruker bare UTF8. Du erstatter deretter alle forekomster av \' med ' å forberede JSON-responsen for JSONModel.

Fordi du allerede har JSON-responsen som en strengobjekt, kan du bruke den tilpassede JSONModel-initialisatoren, initWithString: error: å opprette modelleksemplet. Du bruker GCD til å oppdatere brukergrensesnittet på hovedtråden. Visningsregulatorens tittel er oppdatert med tittel eiendom av PublicPhotosModel forekomst og tabellvisningen blir lastet opp.

Bygg og kjør prosjektet for å kontrollere at tittelen er satt, noe som indikerer at modellobjektet er riktig initialisert. Gi applikasjonen et øyeblikk for å hente JSON-dataene fra Flickrs API. Du bør da se tittelen på feedet øverst på skjermen:

Hvis du av en eller annen grunn ikke ser tittelen på feedet som i skjermbildet ovenfor, legger du til en loggoppføring i ferdighetsbehandleren til dataoppgaven for å feilsøke problemet. Hvis du vil kontrollere om en feil ble kastet mens du opprettet modellobjektet, oppdaterer du initialiseringen av modellobjektet som følger:

NSError * err; self.photosModel = [[PublicPhotosModel alloc] initWithString: rawJSON feil: & feil]; hvis (feil) NSLog (@ "Kan ikke initialisere PublicPhotosModel,% @", err.localizedDescription); 

Som du kan se bruker JSONModel det vanlige kakaofeilhåndteringsparadigmet, noe som betyr at du kan sjekke om initWithString: error: kaster en feil.

4. Implementer tabellvisningen

For øyeblikket behandler JSONModel en rekke elementer som et vanlig utvalg, som inneholder NSDictionary objekter. Dette er greit for nå, men vi oppretter en riktig fotomodell senere i denne opplæringen. Det er på tide å fylle tabellvisningen med elementene i matrisen.

La oss begynne med å bygge brukergrensesnittet. Først vil du sette tittelen på titteloversikten for tabellvisning, som vil vise den siste modifikasjonsdatoen for Flickr-strømmen. Du kan bruke en NSDateFormatter eksempel for å konvertere NSDate motsette seg en lesbar streng og returnere den fra Tableview: titleForHeaderInSection::

- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) seksjon NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; returnere [formatter stringFromDate: self.photosModel.modified]; 

Deretter legger du til de to nødvendige metodene i tabellvisningen for datakildeprotokollen for å fortelle tabellvisningen hvor mange seksjoner og rader den inneholder. Bruk self.publicPhotos.items som tabellvisningens datakilde:

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1;  - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) seksjonen return self.photosModel.items.count; 

Fordi bildevisningen av UITableViewCell klassen laster ikke eksterne bilder asynkront, du trenger en egendefinert UITableViewCell underklasse. Opprett en ny Objective-C-klasse, navn den ImageCell, og gjør det til en underklasse av UITableViewCell. Åpen ImageCell.h og legg til en eiendom av typen UIImageView, webImageView:

#importere  @interface ImageCell: UITableViewCell @property (sterk, ikkeatomisk) UIImageView * webImageView; @slutt

Åpen ImageCell.m og skriv inn startboksen Xcode satt inn der for deg. I initWithStyle:, du må gjemme standardbildevisningen og opprette en ny tilpasset bildevisning. Tro det eller ei, men det er det som kreves for å laste bildene asynkront i en tabellvisningscelle.

- (id) initWithStyle: (UITableViewCellStyle) stil reuseIdentifier: (NSString *) reuseIdentifier self = [super initWithStyle: style reuseIdentifier: reuseIdentifier]; hvis (selv) self.webImageView = [[UIImageView alloc] initWithFrame: CGRectMake (0.0, 0.0, 40.0, 40.0)]; [self addSubview: self.webImageView]; UIGRAphicsBeginImageContextWithOptions (CGSizeMake (20.0, 20.0), NO, kNilOptions); self.imageView.image = UIGraphicsGetImageFromCurrentImageContext (); UIGraphicsEndImageContext ();  returner selv; 

Er du forvirret av andre halvdel av implementeringen? Du lager et tomt bilde på 20px med 20px og angir det som bildet av cellens standardbildevisning. Du gjør dette for å plassere cellens tekstetikett på riktig måte. Dette skjer selv før bildet ditt for den egendefinerte bildevisningen er lastet fra nettet.

revidere ViewController.m og, under de eksisterende importopplysningene, legger til en importerklæring for tilpasset UITableViewCell klasse vi opprettet.

#import "ImageCell.h"

Du er klar for det siste stykket av puslespillet, datakildemetoden for å lage cellene til bordet ditt:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statisk NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; hvis (! celle) celle = [[ImageCell allokere] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  cell.textLabel.text = [@ (indexPath.row) stringValue]; returcelle; 

Bygg og kjør prosjektet enda en gang for å se at tabellen nå viser en celle for hvert av objektene som finnes i elementer. Apropos elementer, det er på tide å lage fotomodellen.

5. Bilde Model

Som vi så i den forrige opplæringen, må du opprette en egen modellklasse for en liste over objekter i JSON-responsen, listen over fotobjekter i vårt eksempel. Opprett en ny Objective-C-klasse, navn den fotomodell, gjør det til en underklasse av JSONModel.

Ta en titt på det raske JSON-svaret du mottar fra Flickr-API og avgjøre hvilke nøkler hvert fotobjekt må ha:

Du vil hente tittelen, nettadressen til bildet, når den ble publisert, og lenken til detaljsiden på Flickr. Vi har imidlertid et problem. Nettadressen til bildet er vedlagt i enda et objekt under media nøkkel. Betyr dette at du må opprette en annen JSONModel underklasse bare for å trekke ut enkeltnøkkelen, m, inneholder nettadressen til bildet?

Heldigvis er det korte svaret Nei. For å løse dette problemet elegant må du lære og forstå hvordan nøkkel kartlegging fungerer i JSONModel. Mapping-nøkler er en enkel måte å instruere JSONModel-underklasse på, hvordan du trekker ut data fra et JSON-svar, noe som er spesielt nyttig hvis JSON-tastene ikke samsvarer nøyaktig med navnene på klassens egenskaper.

Begynn med å erklære egenskapene vi trenger i fotomodell klasse:

#import "JSONModel.h" @interface PhotoModel: JSONModel @property (copy, nonatomic) NSString * tittel; @property (strong, nonatomic) NSURL * url; @property (strong, nonatomic) NSURL * link; @property (strong, nonatomic) NSDate * publisert; @slutt

Vi bruker to av de innebygde datatransformatorene til JSONModel. De publisert er av typen NSDate og JSONModel vil sørge for å konvertere W3C dato til en NSDate gjenstand. De url og link Egenskapene er av typen NSURL og JSONModel vil konvertere de tilsvarende strengene til JSON-responsen til NSURL objekter.

Åpen PhotoModel.m og legg til følgende kodestykke for å sette opp nøkkelkortlegging for fotomodellen:

+ (JSONKeyMapper *) keyMapper NSDictionary * map = @ @ "published": @ "date", @ "media.m": @ "url"; return [[JSONKeyMapper alloc] initWithDictionary: map]; 

I keyMapper, du overstyrer JSONModel s keyMapper metode. Den returnerer a JSONKeyMapper eksempel, objektet som kartlegger JSON-nøkler til eiendomsnavn. De JSONKeyMapper klassen har en praktisk initialiserer som aksepterer en ordliste og skaper en nøkkel kartlegging mellom JSON data og klassen din. 

I ovennevnte implementering av keyMapper, du definerer følgende nøkkelkort:

  • De publisert tast inn JSON-svarskartene til modellens Dato eiendom.
  • De m nøkkel til media objekt i JSON svar kartene til url i modellen.

Med keyMapper implementert, kan JSONModel analysere JSON-responsen og initialisere fotomodellen som definert av fotomodell klasse.

Før du går videre, åpne PhotoModel.h en gang til og, øverst, erklære en protokoll med samme navn som klassens navn:

#import "JSONModel.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (copy, nonatomic) NSString * tittel; @property (strong, nonatomic) NSURL * url; @property (strong, nonatomic) NSURL * link; @property (strong, nonatomic) NSDate * publisert; @slutt

6. Viser fotostrømmen

Bytte til PublicPhotoModel.h og legg til en importoppgave øverst:

#import "PhotoModel.h"

For å gjøre alt dette arbeidet, gjør elementer eiendom holder seg til fotomodell protokoll som vi erklærte for et øyeblikk i fotomodell klasse:

@property (sterk, ikkeatomisk) NSArray * eks;

Du må nå gjøre noen justeringer i din ViewController klasse. For å laste og vise bilder i tabellvisningen din, bruker du en metode som er oppgitt i SDWebImage bibliotek, som ble inkludert i prosjektet du startet med. Åpen ViewController.m og legg til en ny importoppgave øverst:

 #import "UIImageView + WebCache.h"

Neste, se gjennomføringen av Tableview: cellForRowAtIndexPath: der du for øyeblikket bare viser radnummeret. Men fordi du nå kan hente det tilsvarende fotomodell objekt for hver rad i tabellvisningen, er det bedre å vise bildens detaljer i stedet. Oppdater implementeringen som vist nedenfor:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statisk NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; hvis (! celle) celle = [[ImageCell allokere] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  PhotoModel * photo = self.photosModel.items [indexPath.row]; cell.textLabel.text = photo.title; [cell.webImageView setImageWithURL: photo.url placeholderImage: nil]; returcelle; 

Du henter først fotomodell objekt som samsvarer med raden i tabellvisningen, og du fyller deretter i cellens tekstetikett med tittelen på bildet. Du bruker SDWebImage's setImageWithURL: placeholderImage: å asynkront laste og vise bildet fra den oppgitte nettadressen.

Tro det eller ei, du har allerede fått en fungerende fotostrøm. Bygg og kjør prosjektet for å se resultatet:

7. Custom Data Transformations

I denne delen skal du opprette en tilpasset funksjon til fotomodell klassen, som vil konvertere en streng fra JSON-responsen til en egendefinert Objective-C-klasse. Dette vil lære deg hvordan du konverterer alle JSON-data til enhver Objective-C-klasse.

I JSON-dataene for et bilde er det en tags nøkkel som inneholder en streng med koder. Du legger til en ny eiendom i fotomodell klasse. Type av denne egenskapen vil være en egendefinert mål-C-klasse som kan håndtere tagger.

Merk: Du er ikke begrenset til å konvertere JSON-data til egendefinerte Objective-C-klasser. Du kan konvertere JSON-data til en hvilken som helst kakaoklasse. For eksempel kan du konvertere en heksefarge, for eksempel # cc0033, til dens UIColor tilsvarende. Fortsett å lese for å se hvordan du gjør det.

Opprett en ny klasse, navn den Tags, og gjør det til en underklasse av NSObject. Åpen Tags.h og legg til en egenskap for å lagre listen over tagger og erklære en tilpasset initialiserer:

#importere  @interface Merker: NSObject @property (strong, nonatomic) NSArray * tags; #pragma mark - #pragma mark Initialization - (instancetype) initWithString: (NSString *) streng; @slutt

Bytte til Tags.m og implementer initieringen du nettopp erklært. Som du kan se, er det ikke noe spesielt med det. Du bruker strengen til å lage en rekke koder og lagre kodene i tags:

- (instancetype) initWithString: (NSString *) streng self = [super init]; hvis (selv) self.tags = [strengkomponenterSeparatedByString: @ ""];  returner selv; 

Du har nå en egendefinert Tags klassen, men hvordan bruker du den i bildemodellen din? Åpen PhotoModel.h, importer den nye klassen øverst, og erklære en ny eiendom i klassens grensesnitt:

#import "JSONModel.h" #import "Tags.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (copy, nonatomic) NSString * title; @property (strong, nonatomic) NSURL * url; @property (strong, nonatomic) NSURL * link; @property (strong, nonatomic) NSDate * publisert; @property (strong, nonatomic) Tags * tags; @slutt

Bygg og kjør prosjektet ditt som det er å se hva som vil skje.

Fordi det tags Eiendommen er av typen Tags, som JSONModel ikke vet hvordan man skal håndtere, vil programmet krasje, og du bør se følgende feilmelding i XCode-konsollen:

Det er på tide å bli kjent med en ny klasse av JSONModel biblioteket, JSONValueTransformer klasse. I de fleste tilfeller er det JSONValueTransformer Fungerer bak kulissene og konverterer grunnleggende datatyper til deg, NSNumber til en flyte, NSString til NSNumber, eller NSString til NSDate. Klassen kan imidlertid ikke håndtere tilpassede klasser, fordi den ikke vet hvordan man skal jobbe med dem.

Det fine med JSONValueTransformer er at du kan utvide den for å hjelpe deg med å lære hvordan du håndterer egendefinerte klasser - eller en hvilken som helst kakao klasse for den saks skyld.

Å velge Ny> Fil ... fra Xcode er Fil menyen og velg Mål-C kategori fra listen over maler. Klikk neste å fortsette.

Navn kategorien Tags og sett Kategori på til JSONValueTransformer. Klikk neste å fortsette.

I denne kategorien på JSONValueTransformer, Du kan definere de nødvendige metodene for å håndtere egenskaper av typen Tags. Åpen JSONValueTransformer + Tags.h og importer headerfilen til Tags klasse. Deretter legger du til følgende to metoder i grensesnittet til kategorien:

#import "JSONValueTransformer.h" #import "Tags.h" @interface JSONValueTransformer (Tags) - (id) TagsFromNSString: (NSString *) streng; - (id) JSONObjectFromTags: (Tags *) tags; @slutt

La oss se nærmere på navnene på disse metodene.

  • TagsFromNSString: består av navnet på klassen eller typen du vil konvertere til, Tags, etterfulgt av Fra og deretter typen i JSON-dataene for den respektive nøkkelen, NSString. Kort sagt, når JSONModel finner en type eiendom Tags, den vil forsøke å matche en JSON-nøkkel av typen NSString. Når en kamp er funnet, vil den påberope seg TagsFromNSString:.
  • JSONObjectFromTags: håndterer omvendt konvertering. Når JSONModel eksporterer modellobjektet tilbake til JSON-data, må det påkalle en metode som vil ta Tags objekt og returnere en riktig streng. Dermed er navnet på metoden JSONObjectFrom etterfulgt av navnet på klassen eller typen av eiendommen, Tags.

Når du har definert disse to metodene, vil en hvilken som helst JSONModel-underklasse kunne håndtere objekter av typen Tags. Legge til en kategori på JSONValueTransformer er en veldig enkel måte å legge til funksjonalitet til søknadens modellklasser.

La oss se på implementeringen av de to metodene i vår kategori. La oss først implementere metoden som aksepterer en NSString objekt og returnerer a Tags gjenstand:

- (id) TagsFromNSString: (NSString *) streng return [[Tags alloc] initWithString: streng]; 

Takket være den tilpassede initialiseringen, initWithString:, implementeringen er enkel. Det tar strengen av koder fra JSON-dataene og returnerer a Tags objekt, som er tildelt din tags eiendom i fotomodell klasse.

Deretter implementerer du den andre metoden, som påberopes når modellobjektet konverteres til en streng. Dette er metoden som vil bli kalt når du påberoper JSONModel toDictionary og toJSON.

- (id) JSONObjectFromTags: (Tags *) tags return [tags.tags componentsJoinedByString: @ ""]; 

Når en PublicPhotosModel Instans er initialisert, det vil automatisk opprette fotomodell objekter og lagre dem i elementer eiendom. Hver fotomodell objektet vil også opprette a Tags objekt for sin tags eiendom. Alt dette skjer automatisk takket være kategorien vi opprettet på JSONValueTransformer.

La oss nå gjøre bruk av tags eiendom i fotomodell klasse. Åpen ViewController.m og oppdater implementeringen av Tableview: cellForRowAtIndexPath: ved å fylle celleens detaljtekstetikett med bildens liste over tagger.

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statisk NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; hvis (! celle) celle = [[ImageCell allokere] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  PhotoModel * photo = self.photosModel.items [indexPath.row]; cell.textLabel.text = photo.title; cell.detailTextLabel.text = [photo.tags.tags componentsJoinedByString: @ ","]; [cell.webImageView setImageWithURL: photo.url placeholderImage: nil]; returcelle; 

Bygg og kjør prosjektet. Du bør se kodene for hvert bilde som er oppført under bildetidens tittel.

For å gjøre vår Flickr-nettleser fullført, implementer Tableview: didSelectRowAtIndexPath: av UITableViewDelegate protokoll. I Tableview: didSelectRowAtIndexPath:, vi henter det tilsvarende bildet og åpner bildens detaljinformasjon i Safari.

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [self.tableView deselectRowAtIndexPath: indexPath animated: YES]; PhotoModel * photo = self.photosModel.items [indexPath.row]; hvis ([[UIApplication sharedApplication] canOpenURL: photo.link]) [[UIApplication sharedApplication] openURL: photo.link]; 

Når du trykker på en rad i tabellvisningen, blir du tatt til bildetes detaljside på Flickr:

Konklusjon

I denne opplæringen brukte du mer komplekse og kraftige funksjoner i JSONModel-biblioteket. Jeg håper du kan se hva en tidsbesparende JSONModel kan være, og hvordan den kan hjelpe deg på mange nivåer i dine iOS- og OS X-prosjekter. Hvis du vil lære mer om JSONModel, oppfordrer jeg deg til å utforske bibliotekets dokumentasjon.