5

Google Data APIs Objective-C Client Library'u oluşturdum ve uygulamamla bağlantı kurup çalışmamı sağlayın (GTMOAuth2 dahil) ve verileri geri çekebilir. Provisioning API (hala sadece XML) ile çalışmam gerekiyor, böylece kendi uygulamamda ihtiyacım olan eklemeleri yapıyorum. Sonunda tüm bu çalışmaların nasıl olduğunu anladım ve özel elemanları okumak için çok yaşıyorum, ama bir şey eksik.GDataEntryBase'i Google Data Objective-C İstemci Kitaplığından alt sınıflara ayırırken neden "tanınmayan seçici" hatalarını alıyorum?

GDataServiceGoogle, GDataEntryBase ve GDataFeedBase alt sınıflarını oluşturdum ve doğru verileri alıyorum. Basit bir & düz eleman türü ile başlıyorum: quota. Kullanıcılar beslemek yılında kota öğesi şöyle görünür: Yani

, ben şu değer yapısı ekledik:

@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 

Ve ben GDataEntryBase alt sınıf için aşağıdaki yöntemleri ekledik: olarak Uygulanan

- (GDataQuotaProperty *)quota; 
- (void)setQuota:(GDataQuotaProperty *)val; 

aşağıdaki gibidir:

- (GDataQuotaProperty *)quota { 
    return [self objectForExtensionClass:[GDataQuotaProperty class]]; 
} 

- (void)setQuota:(GDataQuotaProperty *)val { 
    [self setObject:val forExtensionClass:[GDataQuotaProperty class]]; 
} 
Ancak

- (void)addExtensionDeclarations { 
    [super addExtensionDeclarations]; 

    Class entryClass = [self class]; 

    // User extensions 
    [self addExtensionDeclarationForParentClass:entryClass 
            childClasses:[GDataQuotaProperty class], nil]; 
} 

ben çalıştığınızda: documented in the comments in GDataObject.h gibi

(ve GDataServiceGoogleCalendar, GDataEntryCalendar kapalı çalışıyoruz ve bir referans uygulaması olarak GDataFeedCalendar) aşağıdaki gibi benim GDataBaseEntry alt sınıfta ben addExtensionDeclarations uyguladık benim geri aramasında şöyle quota yöntemi çağırmak için:

:

GDataTextConstruct *titleTextConstruct = [user title]; 
NSString *title = [titleTextConstruct stringValue]; 
GDataQuotaProperty *quotaConstruct = [user quota]; 
NSString *quota = [quotaConstruct stringValue]; 

bir istisna ve bu hatayı alıyorum

2012-11-19 12:42:22.667 Google Apps Open Directory Sync[47679:903] -[GDataEntryBase quota]: unrecognized selector sent to instance 0x2836d0 

Yukarıdaki örnekte, kullanıcının adını (elemanın title) hatasız bir şekilde doğru şekilde geri alıyorum. Ayrıca, user nesnesinin GDataEntryBase alt sınıfının aslında GDataEntryBase alt sınıfının kendisi değil (hata ayıklayıcısında doğrulanmış), benim GDataFeedBase alt sınıfımdaki classForEntries yönteminin doğru değeri GDataEntryBase alt sınıfımın sınıfını döndürür) gerçekten doğru sınıf olmak zorunda. GDataEntryBase subclass'ın quota metodu üzerinde hiçbir zaman takılmayan bir kırılma noktası var, bu yüzden burada ne eksik var?

belirtildiği gibi, Takvim için Servis/Yem/Giriş uygulanması (özellikle accessLevel & color elemanları ve yöntemler) ile karşılaştırılarak oldum ve ben eksik sadece görmüyorum.

Sağladığınız her türlü yardım için şimdiden teşekkür ederiz.

- (Class)classForEntries { 
    return [GDataEntryUser class]; 
} 

aynı GDataFeedBase alt sınıfta standardKindAttributeValue uygulanmasını kaçırmıştı şu şekildedir: benim GDataFeedBase alt sınıfında classForEntries yöntemi hayata geçirdiklerini ve doğru olarak ondan benim GDataEntryBase alt sınıfının sınıf dönüyordu iken

+2

+1, çünkü bu oldukça iyi biçimlendirilmiş ve ayrıntılı bir sorudur ve ilk düşüncem kütüphanenin "GDataQuotaProperty" adlı temeli aradığı ve alt sınıfınız hakkında hiçbir şey bilmediği. Bu, bir kategoriyle başarabilecek bir şey olabilir, bilmiyorum. Bunu biraz daha düşünmeliyim. –

+0

Teşekkürler, temel sınıfın alt sınıfı bulamamasının bir olasılık olduğunu kabul ediyorum. Google Data Object-C kitaplıklarını kullanan ve bağlantı sorunlarını gidererek çözülen benzer "tanınmayan seçici" hatalar almanın birkaç örneğini buldum, bu yüzden düşündüğüm bir şey var ("GDataObject.h" ifadelerine rağmen " Uzantıların asıl amacı, öğelerin "" hakkında bilmeyebilecekleri çocukları içermesine izin vermektir. – morgant

+0

Soruyu bir kaç tane daha açıklamayla güncelledim. "kullanıcı kotası" örnek çağrısındaki 'kullanıcı' değişkeni ile ilgili. – morgant

cevap

1

uygun kategori şema URL'sini (Google Provisioning API Kullanıcı özet akışları söz konusu olduğunda "http://schemas.google.com/apps/2006#user") iade etmelidir.

+ (NSString *)standardKindAttributeValue { 
    return @"http://schemas.google.com/apps/2006#user"; 
} 

kez addExtensionDeclarations, classForEntries ve standardKindAttributeValue tüm GDataEntryBase doğru benim alt sınıf içinde nesneler için kullanılması gerektiğini belirlemek başardı, doğru bir şekilde uygulandığında edildi: Yani, (Ben aslında bir sabit kullanırlar rağmen) şu şekilde uygulanan besleme ve böylece seçicilerim tanınıyordu.

Bana Google'ın Greg Robbins için doğru yönde in this thread on the Google Data APIs Objective-C Client Libraries discussion group işaret ettiği için çok teşekkürler.

İlgili konular