Ich habe die Google Data APIs Objective-C Client Library gebaut und habe es mit meiner Anwendung verknüpfen und arbeiten (inkl. GTMOAuth2) und kann Daten zurückziehen. Ich muss mit der Provisioning API (noch XML-only) arbeiten, also baue ich die Zusätze aus, die ich innerhalb meiner eigenen Anwendung benötige. Ich denke, ich habe endlich herausgefunden, wie das alles funktioniert und ich bin sehr nahe an benutzerdefinierten Elementen zu lesen, aber ich vermisse etwas.Warum erhalte ich bei der Unterklassierung von GDataEntryBase aus der Google Data Objective-C-Clientbibliothek "nicht erkannte Selektorfehler"?
Ich habe GDataServiceGoogle
, GDataEntryBase
und GDataFeedBase
unterklassifiziert und erhalte korrekte Daten zurück. Ich beginne mit einem einfachen & einfachen Elementtyp: quota
. In den Nutzer füttern, wie dies die Quote Element aussieht:
folgenden Wert Konstrukt Also, ich habe hinzugefügt:
@interface GDataQuotaProperty : GDataValueConstruct <GDataExtension>
+ (NSString *)extensionElementURI;
+ (NSString *)extensionElementPrefix;
+ (NSString *)extensionElementLocalName;
@end
@implementation GDataQuotaProperty
+ (NSString *)extensionElementURI { return kGDataNamespaceGApps; }
+ (NSString *)extensionElementPrefix { return kGDataNamespaceGAppsPrefix; }
+ (NSString *)extensionElementLocalName { return @"quota"; }
@end
Und ich habe die folgenden Methoden zu meiner GDataEntryBase
Unterklasse hinzugefügt:
- (GDataQuotaProperty *)quota;
- (void)setQuota:(GDataQuotaProperty *)val;
wie folgt umgesetzt:
- (GDataQuotaProperty *)quota {
return [self objectForExtensionClass:[GDataQuotaProperty class]];
}
- (void)setQuota:(GDataQuotaProperty *)val {
[self setObject:val forExtensionClass:[GDataQuotaProperty class]];
}
Als documented in the comments in GDataObject.h
(und ich habe aus der GDataServiceGoogleCalendar
arbeiten, GDataEntryCalendar
und GDataFeedCalendar
als Referenz-Implementierung), meiner GDataBaseEntry
Unterklasse habe ich umgesetzt addExtensionDeclarations
wie folgt:
- (void)addExtensionDeclarations {
[super addExtensionDeclarations];
Class entryClass = [self class];
// User extensions
[self addExtensionDeclarationForParentClass:entryClass
childClasses:[GDataQuotaProperty class], nil];
}
aber wenn ich versuche, die quota
Methode aufzurufen, wie in meinem Rückruf folgt:
GDataTextConstruct *titleTextConstruct = [user title];
NSString *title = [titleTextConstruct stringValue];
GDataQuotaProperty *quotaConstruct = [user quota];
NSString *quota = [quotaConstruct stringValue];
ich erhalte eine Ausnahme und diesen Fehler:
2012-11-19 12:42:22.667 Google Apps Open Directory Sync[47679:903] -[GDataEntryBase quota]: unrecognized selector sent to instance 0x2836d0
Im obigen Beispiel bekomme ich den Benutzernamen (title
des Elements) fehlerfrei zurück. Auch das user
Objekt ist tatsächlich von der Art meiner GDataEntryBase
Unterklasse, nicht GDataEntryBase
selbst (im Debugger verifiziert), plus die classForEntries
Methode in meiner GDataFeedBase
Unterklasse gibt die Klasse meiner Unterklasse von GDataEntryBase
korrekt zurück, so zwischen den beiden davon wirklich muss die richtige Klasse sein. Ich habe einen Breakpoint auf meiner GDataEntryBase
Unterklasse quota
Methode, die nie ausgelöst wird, also was fehlt mir hier?
Wie bereits erwähnt, habe ich für Kalender mit dem Service/Futtermittel/Eintrag Implementierung wurde Vergleich (insbesondere die accessLevel
& color
Elemente und Methoden) und bin einfach nicht sehen, was mir fehlt.
Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.
+1, weil dies eine ziemlich gut geformte und detaillierte Frage ist, und mein erster Gedanke ist, dass die Bibliothek nach der Basis "GDataQuotaProperty" Klasse sucht und nichts über Ihre Unterklasse weiß. Dies könnte etwas sein, was mit einer Kategorie erreicht werden könnte, ich weiß nicht. Ich muss darüber noch etwas nachdenken. –
Danke, ich stimme zu, dass es möglich ist, dass die Basisklasse die Unterklasse nicht finden kann. Ich habe ein paar andere Beispiele von Personen gefunden, die die Google Data Objective-C-Bibliotheken verwenden und ähnliche "unerkannte Selektor" -Fehler erhalten, die durch Beheben von Verknüpfungsproblemen behoben wurden. Das ist etwas, das ich in Betracht gezogen habe (obwohl "GDataObject.h" angibt). Der wahre Zweck von Erweiterungen besteht darin, Elementen zu erlauben, Kinder zu enthalten, von denen sie vielleicht nichts wissen "). – morgant
Ich habe die Frage mit ein paar weiteren Erläuterungen aktualisiert, insb. in Bezug auf die Variable 'user' in' [user quota] 'Beispielaufruf. – morgant