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:
Den ferdige Flickr-nettleseren vil se slik ut:
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.
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.
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.
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.
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:
publisert
tast inn JSON-svarskartene til modellens Dato
eiendom.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
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:
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:
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.