In meinem vorherigen Artikel haben Sie die Grundlagen von JSONModel kennengelernt. Sie haben gesehen, wie einfach es ist, mit JSON mit JSONModel zu arbeiten, und wie es hinter den Kulissen viel für Sie leistet, wie zum Beispiel Datenvalidierung und -konvertierung.
In diesem Lernprogramm erstellen Sie eine komplexere Anwendung und lernen eine Reihe von Funktionen kennen, die Ihre Modellklassen noch leistungsfähiger machen.
Am Ende dieses Artikels haben Sie einen Flickr-Browser für iOS erstellt. Die Anwendung spricht mit der JSON-API von Flickr und zeigt eine Sammlung von Fotos an, die ich für dieses Lernprogramm auf Flickr hochgeladen habe.
Du wirst lernen wie:
Der fertige Flickr-Browser sieht folgendermaßen aus:
Da wir uns auf die Funktionsweise von JSONModel konzentrieren werden, möchte ich zunächst mit einem grundlegenden Projekt beginnen. Sie finden das Projekt in den Quelldateien dieses Tutorials.
Öffnen Sie das Xcode-Projekt und nehmen Sie sich einen Moment Zeit, um den Inhalt zu überprüfen. Das Projekt hat ein einfaches Setup, einen Controller für eine einzelne Tabellensicht, der eine leere Tabellensicht zeigt. Ich habe auch zwei Bibliotheken in das Projekt aufgenommen, JSONModel und SDWebImage.
Erstellen Sie das Projekt, und führen Sie es aus, um sicherzustellen, dass das Projekt ohne Fehler kompiliert wird.
Werfen wir einen Blick auf den öffentlichen Foto-Feed von Flickr. Öffnen Sie den API-Endpunkt in Ihrem Browser und nehmen Sie sich einen Moment Zeit, um die Antwort zu überprüfen. Die Antwort enthält nur einige Schlüssel der obersten Ebene, wie z Titel
und geändert
. Es gibt auch einen Schlüssel namens Artikel
enthält eine Liste von Fotoobjekten mit jeweils einem Titel
, Verknüpfung
, Beschreibung
, usw.
Im folgenden Screenshot habe ich eines dieser Fotoobjekte in der Liste hervorgehoben Artikel
Array, um Ihnen zu helfen, seine Eigenschaften herauszufinden.
Beginnen wir mit der Erstellung einer Modellklasse für die Antwort des öffentlichen Foto-Feeds. Erstellen Sie eine neue Klasse in Xcode, nennen Sie sie PublicFotosModel
, und machen es erben von JSONModel
. Sie interessieren sich für das Titel
und geändert
Wenn Sie die Schlüssel der JSON-Antwort angeben, fügen Sie der Schnittstelle des Servers zwei Eigenschaften mit denselben Namen hinzu PublicPhotoModel
Klasse. Sie werden auch das Array mit Fotos abrufen und in einer Eigenschaft speichern, die wir benennen Artikel
. Legen Sie den Typ der fest Artikel
Eigentum an NSArray
Wie nachfolgend dargestellt.
#import "JSONModel.h" @interface PublicPhotosModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ Eigenschaft (stark, nichtatomar) NSDate * modifiziert; @ property (strong, nonatomic) NSArray * -Elemente; @Ende
In diesem Beispiel verwenden Sie einen der integrierten Datentransformatoren von JSONModel. Wenn Ihre JSON-Antwort ein Datum enthält, das dem W3C-Format entspricht, können Sie die übereinstimmende Modelleigenschaft des Typs deklarieren NSDate
und JSONModel wird wissen, was zu tun ist.
Ihre grundlegende Modellklasse zum Abrufen von JSON-Daten von der Flickr-API ist fertig. Verbinden wir es mit der Tabellensicht in Ihrem View-Controller. Sie werden das verwenden Artikel
Array in Ihrem Modellobjekt, das die Antwort der Flickr-API darstellt, als Datenquelle der Tabellenansicht.
Hinweis: Möglicherweise fragen Sie sich, wie Datumsangaben konvertiert werden, wenn sie nicht dem W3C-Standard entsprechen oder die JSON-Antwort Zeitstempel enthält. Weiter lesen. Vor dem Ende dieses Lernprogramms wissen Sie, wie Sie einen beliebigen Wert in ein Objective-C-Objekt umwandeln.
Beginnen Sie mit dem Öffnen ViewController.m und fügen Sie unter der vorhandenen import-Anweisung eine import-Anweisung für die gerade erstellte Modellklasse hinzu:
#import "PublicPhotosModel.h"
Als Nächstes deklarieren Sie eine private Eigenschaft zum Speichern von PublicFotosModel
Beispiel verwenden wir:
@Interface ViewController () @Eigenschaft (stark, nicht atomar) PublicPhotosModel * photosModel; @Ende
Sie holen die JSON-Daten mithilfe einer Hilfsmethode ab, FetchPhotos
, welche wir in Kürze umsetzen werden. Wir rufen an FetchPhotos
in der Ansicht Controller viewDidLoad
Methode:
- (void) viewDidLoad [super viewDidLoad]; // Fotos abrufen [selbst Abrufbilder];
Im FetchPhotos
, Wir verwenden die NSURLSession-Klasse, um die Flickr-API abzufragen, wie Sie unten sehen können:
- (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 * -Daten, NSURLResponse * -Antwort, NSError * -Fehler) // Process Data] Lebenslauf];
Die Implementierung ist ziemlich ähnlich wie in dem vorherigen Artikel über JSONModel. Du erklärst zuerst photosURL
, die die URL eines bestimmten Feeds von Fotos auf Flickr enthält, und dann erstellen und auslösen NSURLSessionDataTask
Instanz, um die Liste der Fotos dieses Feeds abzurufen.
Hinweis: Wenn Sie über ein Flickr-Konto verfügen und Ihre Flickr-ID kennen, geben Sie diese bitte in die Anforderungs-URL ein, damit die Anwendung Ihren eigenen Foto-Feed abrufen kann.
Wenn Sie den ersten Artikel über JSONModel gelesen haben, wissen Sie bereits, wie man das ändert NSData
Von der Datentask zurückgegebenes Objekt in eine JSONModel
Objekt. Flickr gibt jedoch nicht immer eine gültige JSON-Antwort zurück. Mit anderen Worten, Sie müssen einige Vorverarbeitungen durchführen, bevor Sie Ihr Modellobjekt erstellen.
Die Flickr-API hat ein besonderes Merkmal in der JSON-Antwort werden einfache Anführungszeichen vermieden. Das Problem ist, dass dies die JSON-Antwort gemäß den aktuellen Standards ungültig macht und als Ergebnis die JSON-Antwort NSJSONSerialisierung
API kann es nicht verarbeiten.
Um dies zu beheben, müssen Sie nur die mit einem Escapezeichen versehenen einfachen Anführungszeichen in der JSON-Antwort entfernen. Sie können dann Ihr Modellobjekt sicher erstellen. Ersetzen // Prozessdaten
mit dem folgenden Ausschnitt:
NSString * rawJSON = [[NSString-Zuordnung] initWithData: Datenkodierung: NSUTF8StringEncoding]; rawJSON = [rawJSON stringByReplacingOccurrencesOfString: @ "\\ '" withString: @ "'"]]; self.photosModel = [[PublicPhotosModel-Zuordnung] initWithString: rawJSON-Fehler: Null]; dispatch_async (dispatch_get_main_queue (), ^ self.title = self.photosModel.title; [self.tableView reloadData];);
Sie beginnen mit der Erstellung einer NSString
Objekt aus der NSData
Instanz kehrt die Datenaufgabe an Sie zurück. Es kann davon ausgegangen werden, dass der Text UTF8-codiert ist, da Flickr nur UTF8 verwendet. Sie ersetzen dann alle Vorkommen von \ '
mit '
um die JSON-Antwort für JSONModel vorzubereiten.
Da Sie die JSON-Antwort bereits als Zeichenfolgenobjekt haben, können Sie den benutzerdefinierten JSONModel-Initialisierer verwenden, initWithString: Fehler:
um die Modellinstanz zu erstellen. Sie verwenden GCD, um die Benutzeroberfläche des Hauptthreads zu aktualisieren. Der Titel des View-Controllers wird mit dem aktualisiert Titel
Eigentum der PublicFotosModel
Instanz und die Tabellensicht wird neu geladen.
Erstellen Sie das Projekt, und führen Sie es aus, um zu überprüfen, ob der Titel festgelegt ist. Dies zeigt an, dass das Modellobjekt ordnungsgemäß initialisiert wurde. Geben Sie der Anwendung einen Moment, um die JSON-Daten von der Flickr-API abzurufen. Sie sollten dann den Titel des Feeds oben auf dem Bildschirm sehen:
Wenn der Titel des Feeds aus irgendeinem Grund nicht wie in der Abbildung oben angezeigt wird, fügen Sie im Completion-Handler der Datentask eine Protokollanweisung zum Debuggen des Problems hinzu. Wenn Sie prüfen möchten, ob beim Erstellen des Modellobjekts ein Fehler aufgetreten ist, aktualisieren Sie die Initialisierung des Modellobjekts wie folgt:
NSError * err; self.photosModel = [[PublicPhotosModel-Zuordnung] initWithString: rawJSON-Fehler: & err]; if (err) NSLog (@ "PublicPhotosModel,% @ kann nicht initialisiert werden", err.localizedDescription);
Wie Sie sehen, verwendet JSONModel das Standard-Fehlerbehandlungsparadigma von Cocoa, dh Sie können überprüfen, ob initWithString: Fehler:
wirft einen Fehler.
Im Moment behandelt JSONModel das Array von Elementen als ein gewöhnliches Array, das enthält NSDictionary
Objekte. Dies ist vorerst in Ordnung, aber wir werden später in diesem Tutorial ein passendes Fotomodell erstellen. Es ist an der Zeit, die Tabellenansicht mit den Elementen im Array zu füllen.
Beginnen wir mit dem Aufbau der Benutzeroberfläche. Zuerst legen Sie den Titel der Kopfzeile der Tabellensicht fest, in der das Datum der letzten Änderung des Flickr-Feeds angezeigt wird. Sie können eine verwenden NSDateFormatter
Instanz zum Konvertieren der NSDate
Objekt in eine lesbare Zeichenfolge und geben Sie es von zurück tableView: titleForHeaderInSection:
:
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) Abschnitt NSDateFormatter * formatter = [[NSDateFormatter-Zuordnung] init]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; return [formatierer stringFromDate: self.photosModel.modified];
Fügen Sie anschließend die zwei erforderlichen Methoden des Tabellenquellen-Datenquellenprotokolls hinzu, um der Tabellensicht mitzuteilen, wie viele Abschnitte und Zeilen darin enthalten sind. Benutzen self.publicPhotos.items
als Datenquelle der Tabellensicht:
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt return self.photosModel.items.count;
Weil die Bildansicht der UITableViewCell
Die Klasse lädt keine Remote-Images asynchron. Sie benötigen einen benutzerdefinierten Wert UITableViewCell
Unterklasse. Erstellen Sie eine neue Objective-C-Klasse, und nennen Sie sie ImageCell
, und mache es eine Unterklasse von UITableViewCell
. Öffnen ImageCell.h und fügen Sie eine Eigenschaft des Typs hinzu UIImageView
, webImageView
:
#einführen@interface ImageCell: UITableViewCell @property (stark, nicht atomar) UIImageView * webImageView; @Ende
Öffnen ImageCell.m und überschreiben Sie den dort eingestellten Initializer-Xcode. Im initWithStyle:
, Sie müssen die Standardbildansicht ausblenden und eine neue benutzerdefinierte Bildansicht erstellen. Glauben Sie es oder nicht, aber es ist das, was Sie brauchen, um Bilder asynchron in eine Tabellensichtzelle zu laden.
- (id) initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString *) reuseIdentifier self = [super initWithStyle: style reuseIdentifier: reuseIdentifier]; if (self) self.webImageView = [[UIImageView-Zuordnung] 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 (); return self;
Sind Sie durch die zweite Hälfte der Implementierung verwirrt? Sie erstellen ein leeres Bild von 20 x 20 Pixel und legen es als das Bild der Standardbildansicht der Zelle fest. So legen Sie die Beschriftung der Zelle richtig fest. Dies geschieht sogar, bevor das Bild für Ihre benutzerdefinierte Bildansicht aus dem Web geladen wird.
Erneut besuchen ViewController.m Fügen Sie unter den vorhandenen Importanweisungen eine Importanweisung für den Benutzer hinzu UITableViewCell
Klasse, die wir geschaffen haben.
#import "ImageCell.h"
Sie sind bereit für das letzte Puzzleteil, die Datenquellenmethode zum Erstellen der Zellen für Ihre Tabelle:
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId]; cell.textLabel.text = [@ (indexPath.row) stringValue]; zurück Zelle;
Erstellen Sie das Projekt erneut, und führen Sie es erneut aus, um zu sehen, dass die Tabelle jetzt für jedes der gefundenen Objekte eine Zelle anzeigt Artikel
. Apropos Artikel
, Es ist Zeit, das Fotomodell zu erstellen.
Wie wir im vorherigen Tutorial gesehen haben, müssen Sie eine separate Modellklasse für eine Liste von Objekten in der JSON-Antwort erstellen, in unserem Beispiel die Liste der Fotoelemente. Erstellen Sie eine neue Objective-C-Klasse, und nennen Sie sie Fotomodell
, mache es eine Unterklasse von JSONModel
.
Schauen Sie sich noch einmal die rohe JSON-Antwort an, die Sie von der Flickr-API erhalten, und entscheiden Sie, welche Schlüssel jedes Fotoobjekt haben muss:
Sie möchten den Titel, die URL des Fotos, als es veröffentlicht wurde, und den Link zur Detailseite von Flickr abrufen. Wir haben jedoch ein Problem. Die URL des Fotos befindet sich in einem weiteren Objekt unter der Medien
Schlüssel. Bedeutet dies, dass Sie ein anderes erstellen müssen JSONModel
Unterklasse nur zum Extrahieren des einzelnen Schlüssels, m
, mit der URL des Fotos?
Zum Glück ist die kurze Antwort Nein. Um dieses Problem auf elegante Weise zu lösen, müssen Sie die Funktionsweise der Schlüsselzuordnung in JSONModel kennen und verstehen lernen. Das Zuordnen von Schlüsseln ist eine einfache Methode, um Ihre JSONModel-Unterklasse mitzuteilen, wie Daten aus einer JSON-Antwort extrahiert werden sollen. Dies ist besonders hilfreich, wenn die JSON-Schlüssel nicht genau mit den Namen der Klasseneigenschaften übereinstimmen.
Beginnen Sie mit der Deklaration der Eigenschaften, die wir benötigen Fotomodell
Klasse:
#import "JSONModel.h" @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @Ende
Wir verwenden zwei der eingebauten Datentransformatoren von JSONModel. Das veröffentlicht
ist vom Typ NSDate
und JSONModel stellt sicher, dass das konvertiert wird W3C Datum zu einem NSDate
Objekt. Das url
und Verknüpfung
Eigenschaften sind vom Typ NSURL
und JSONModel konvertiert die entsprechenden Zeichenfolgen der JSON-Antwort in NSURL
Objekte.
Öffnen PhotoModel.m Fügen Sie das folgende Code-Snippet hinzu, um die Schlüsselzuordnung für das Fotomodell einzurichten:
+ (JSONKeyMapper *) keyMapper NSDictionary * map = @ @ "Published": @ "date", @ "media.m": @ "url"; return [[JSONKeyMapper-Zuordnung] initWithDictionary: map];
Im keyMapper
, Sie überschreiben JSONModels keyMapper
Methode. Es wird ein zurückgegeben JSONKeyMapper
Instanz, das Objekt, das JSON-Schlüssel zu Eigenschaftsnamen zuordnet. Das JSONKeyMapper
Die Klasse verfügt über einen praktischen Initialisierer, der ein Wörterbuch akzeptiert und eine Schlüsselzuordnung zwischen den JSON-Daten und Ihrer Klasse erstellt.
In der obigen Implementierung von keyMapper
, Sie definieren die folgende Schlüsselzuordnung:
veröffentlicht
Geben Sie die JSON-Antwort in das Modell ein Datum
Eigentum.m
Schlüssel der Medien
Objekt in der JSON-Antwort wird zugeordnet url
im Modell.Mit keyMapper
implementiert, kann JSONModel die JSON-Antwort parsen und das Fotomodell initialisieren, wie von der definiert Fotomodell
Klasse.
Bevor Sie fortfahren, öffnen Sie sich PhotoModel.h
noch einmal und deklarieren Sie oben ein Protokoll mit demselben Namen wie der Name der Klasse:
#import "JSONModel.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @Ende
Wechseln zu PublicPhotoModel.h und fügen Sie oben eine Importanweisung ein:
#import "PhotoModel.h"
Damit das alles funktioniert, machen Sie das Artikel
Eigentum haftet an der Fotomodell
Protokoll, das wir vor kurzem in der Fotomodell
Klasse:
@ property (stark, nichtatomar) NSArray*Artikel;
Sie müssen jetzt einige Anpassungen an Ihrem Computer vornehmen ViewController
Klasse. Um Fotos in die Zellen Ihrer Tabellenansicht zu laden und anzuzeigen, verwenden Sie eine in der deklarierte Methode SDWebImage Bibliothek, die in dem Projekt enthalten war, mit dem Sie begonnen haben. Öffnen ViewController.m und fügen Sie eine neue Importanweisung oben ein:
#import "UIImageView + WebCache.h"
Als nächstes überdenken Sie Ihre Implementierung von tableView: cellForRowAtIndexPath:
in dem Sie momentan nur die Zeilennummer anzeigen. Da Sie aber jetzt das entsprechende abrufen können Fotomodell
Objekt für jede Zeile in der Tabellenansicht, ist es besser, stattdessen die Details des Fotos anzuzeigen. Aktualisieren Sie die Implementierung wie folgt:
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId]; PhotoModel * photo = self.photosModel.items [indexPath.row]; cell.textLabel.text = photo.title; [cell.webImageView setImageWithURL: photo.url placeholderImage: nil]; zurück Zelle;
Sie holen zuerst die Fotomodell
Ein Objekt, das der Zeile in der Tabellenansicht entspricht, und Sie füllen dann die Beschriftung der Zelle mit dem Titel des Fotos auf. Sie verwenden SDWebImage setImageWithURL: placeholderImage:
das Foto asynchron von der angegebenen URL laden und anzeigen.
Ob Sie es glauben oder nicht, Sie haben bereits einen funktionierenden Fotostream. Erstellen und führen Sie das Projekt aus, um das Ergebnis anzuzeigen:
In diesem Abschnitt erstellen Sie eine benutzerdefinierte Funktion für die Fotomodell
Klasse, die eine Zeichenfolge aus der JSON-Antwort in eine benutzerdefinierte Objective-C-Klasse konvertiert. Hier erfahren Sie, wie Sie JSON-Daten in eine Objective-C-Klasse konvertieren.
In den JSON-Daten für ein Foto gibt es eine Stichworte
Schlüssel, der eine Folge von Tags enthält. Sie fügen dem eine neue Eigenschaft hinzu Fotomodell
Klasse. Der Typ dieser Eigenschaft ist eine benutzerdefinierte Objective-C-Klasse, die Tags behandeln kann.
Hinweis: Sie können JSON-Daten nicht in benutzerdefinierte Objective-C-Klassen konvertieren. Sie können JSON-Daten in jede Cocoa-Klasse konvertieren. Sie können beispielsweise eine Hex-Farbe konvertieren, z # cc0033, zu seinen UIColor
Äquivalent. Lesen Sie weiter, um zu sehen, wie das geht.
Erstellen Sie eine neue Klasse, benennen Sie sie Stichworte
, und mache es eine Unterklasse von NSObject
. Öffnen Tags.h Fügen Sie eine Eigenschaft hinzu, um die Liste der Tags zu speichern und einen benutzerdefinierten Initialisierer zu deklarieren:
#einführen@interface-Tags: NSObject @property (stark, nicht atomar) NSArray * -Tags; #pragma mark - #pragma mark Initialisierung - (instancetype) initWithString: (NSString *) string; @Ende
Wechseln zu Tags.m und Implementierung des gerade deklarierten Initialisierers. Sie sehen, es ist nichts Besonderes. Mit der Zeichenfolge erstellen Sie ein Array von Tags und speichern die Tags in Stichworte
:
- (instancetype) initWithString: (NSString *) Zeichenfolge self = [super init]; if (self) self.tags = [Zeichenfolge componentsSeparatedByString: @ ""]]; return self;
Sie haben jetzt einen Brauch Stichworte
Klasse, aber wie verwenden Sie es in Ihrem Fotomodell? Öffnen PhotoModel.h, Importieren Sie die neue Klasse oben und deklarieren Sie eine neue Eigenschaft in der Schnittstelle der Klasse:
#import "JSONModel.h" #import "Tags.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @ property (strong, nonatomic) Tags * Tags; @Ende
Erstellen und führen Sie Ihr Projekt so aus, wie es ist.
Weil der Stichworte
Eigenschaft ist vom Typ Stichworte
, Mit welchem JSONModel nicht zu tun ist, stürzt die Anwendung ab und es wird folgende Fehlermeldung in der XCode-Konsole angezeigt:
Es ist Zeit, sich mit einer neuen Klasse der JSONModel-Bibliothek vertraut zu machen, der JSONValueTransformer
Klasse. In den meisten Fällen ist das JSONValueTransformer
arbeitet hinter den Kulissen und konvertiert grundlegende Datentypen für Sie, NSNumber
zu einem schweben
, NSString
zu NSNumber
, oder NSString
zu NSDate
. Die Klasse kann jedoch nicht mit benutzerdefinierten Klassen umgehen, da sie nicht weiß, wie sie damit arbeiten soll.
Das Schöne an JSONValueTransformer
Sie können es erweitern, um zu lernen, wie Sie mit benutzerdefinierten Klassen oder einer beliebigen Cocoa-Klasse umgehen.
Wählen Neu> Datei… von Xcode's Datei Menü und wählen Sie Ziel-C-Kategorie aus der Liste der Vorlagen. Klicken Nächster weitermachen.
Benennen Sie die Kategorie Stichworte und setzen Kategorie ein zu JSONValueTransformer
. Klicken Nächster weitermachen.
In dieser Kategorie auf JSONValueTransformer
, Sie können die erforderlichen Methoden definieren, um die Eigenschaften des Typs zu behandeln Stichworte
. Öffnen JSONValueTransformer + Tags.h und importieren Sie die Header-Datei des Stichworte
Klasse. Fügen Sie der Schnittstelle der Kategorie die folgenden zwei Methoden hinzu:
#import "JSONValueTransformer.h" #import "Tags.h" @interface JSONValueTransformer (Tags) - (id) TagsFromNSString: (NSString *) Zeichenfolge; - (id) JSONObjectFromTags: (Tags *) - Tags; @Ende
Schauen wir uns die Namen dieser Methoden genauer an.
TagsFromNSString:
besteht aus dem Namen der Klasse oder des Typs, in den Sie konvertieren möchten, Stichworte
, gefolgt von Von und dann den Typ in den JSON-Daten für den jeweiligen Schlüssel, NSString
. Kurz gesagt, wenn JSONModel eine Eigenschaft vom Typ findet Stichworte
, Es wird versucht, einen JSON-Schlüssel des Typs zu finden NSString
. Wenn eine Übereinstimmung gefunden wird, wird sie aufgerufen TagsFromNSString:
.JSONObjectFromTags:
übernimmt die umgekehrte Konvertierung. Wenn JSONModel Ihr Modellobjekt wieder in JSON-Daten exportiert, muss eine Methode aufgerufen werden, die die Stichworte
object und geben Sie einen richtigen String zurück. So heißt die Methode JSONObjectFrom
gefolgt vom Namen der Klasse oder des Typs der Eigenschaft, Stichworte
.Wenn Sie diese beiden Methoden definiert haben, kann jede JSONModel-Unterklasse Objekte des Typs verarbeiten Stichworte
. Hinzufügen einer Kategorie zu JSONValueTransformer
ist eine sehr einfache Möglichkeit, die Modellklassen Ihrer Anwendung um Funktionalität zu erweitern.
Betrachten wir nun die Implementierung der beiden Methoden in unserer Kategorie. Lassen Sie uns zuerst die Methode implementieren, die ein akzeptiert NSString
Objekt und gibt ein Stichworte
Objekt:
- (id) TagsFromNSString: (NSString *) string return [[Tags zuteilen] initWithString: string];
Dank des benutzerdefinierten Initialisierers, initWithString:
, Die Implementierung ist einfach. Es entnimmt die Zeichenfolge der Tags aus den JSON-Daten und gibt a zurück Stichworte
Objekt, das Ihrem zugeordnet ist Stichworte
Eigentum in der Fotomodell
Klasse.
Als Nächstes implementieren Sie die zweite Methode, die aufgerufen wird, wenn das Modellobjekt in eine Zeichenfolge konvertiert wird. Diese Methode wird aufgerufen, wenn Sie JSONModels aufrufen toDictionary
und tojson
.
- (id) JSONObjectFromTags: (Tags *) tags return [tags.tags componentsJoinedByString: @ ""]];
Wenn ein PublicFotosModel
Instanz initialisiert wird, wird sie automatisch erstellt Fotomodell
Objekte und lagern sie in der Artikel
Eigentum. Jeder Fotomodell
Objekt erstellt auch eine Stichworte
Objekt für seine Stichworte
Eigentum. All dies geschieht automatisch dank der von uns erstellten Kategorie JSONValueTransformer
.
Lassen Sie uns jetzt das nutzen Stichworte
Eigentum in der Fotomodell
Klasse. Öffnen ViewController.m und aktualisieren Sie die Implementierung von tableView: cellForRowAtIndexPath:
indem Sie die Detailtextbeschriftung der Zelle mit der Liste der Tags des Fotos füllen.
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] 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]; zurück Zelle;
Erstellen Sie das Projekt und führen Sie es aus. Unter dem Titel des Fotos sollten die Tags für jedes Foto angezeigt werden.
Um unseren Flickr-Browser komplett zu machen, implementieren Sie tableView: didSelectRowAtIndexPath:
des UITableViewDelegate
Protokoll. Im tableView: didSelectRowAtIndexPath:
, Wir holen das entsprechende Foto ab und öffnen die Detailseite des Fotos in Safari.
- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [self.tableView deselectRowAtIndexPath: indexPath animated: YES]; PhotoModel * photo = self.photosModel.items [indexPath.row]; if ([[UIApplication sharedApplication] canOpenURL: photo.link]) [[UIApplication sharedApplication] openURL: photo.link];
Wenn Sie in der Tabellenansicht auf eine Zeile tippen, werden Sie zur Detailseite des Fotos auf Flickr geführt:
In diesem Lernprogramm haben Sie komplexere und leistungsfähigere Funktionen der JSONModel-Bibliothek verwendet. Ich hoffe, Sie können sehen, was für ein Zeitsparer JSONModel sein kann und wie es Ihnen auf vielen Ebenen in Ihren iOS- und OS X-Projekten helfen kann. Wenn Sie mehr über JSONModel erfahren möchten, sollten Sie sich die Dokumentation der Bibliothek genauer ansehen.