2010-02-23 64 views
2

鑑於這種鍵/值對:
FirstName = "Steve"如何使用Key值編碼設置屬性值在ABPerson

我想設置一個ABPerson的財產在iPhone地址簿,就像這樣: ABRecordSetValue(person, kABPersonFirstNameProperty, @"Steve", nil);

問題是,我不會總是知道提交什麼密鑰。 (它將相當於一個屬性常量,前面沒有「kABPerson」,後面跟着「屬性」)。 提交的密鑰可以是任何數量的屬性:「JobTitle」,「注」等。 如何將該密鑰翻譯爲地址簿屬性常量。即:
FirstName to kABPersonFirstNameProperty

我在想我可以使用Key Value Coding,但是我對如何在這種情況下實現它感到茫然。

爲了提高編碼效率,我試圖避免使用長的Switch語句,或者使用填充每個可能屬性的數組。

更新

我發現在這裏,我需要通過它的字符串表示訪問一個常數。但我不知道這是否可能。所以kABPersonJobTitleProperty是一個常數,等於18。所以,如果下面的代碼工作,我會愛:

 
    NSString *fieldName = [NSString stringWithString:@"JobTitle"]; 
    NSString *propertyName = [NSString stringWithFormat:@"kABPerson%@Property", fieldName];

ABRecordRef person = ABPersonCreate(); ABRecordSetValue(person, propertyName, @"Fisherman", nil);

當然,運行此返回此警告過客「ABRecordSetValue」的論點2將指針整數,未作投。因爲字符串propertyName不能解析爲它正在尋找的整數或常量。

任何人都可以看到一種方法來使這項工作?

我的設置是相似這裏列出的問題:
Key-Value Coding

我收到我可以控制的XML數據,並把它變成了一個通訊簿條目的屬性。

回答

2

這比其他任何應用程序設計問題更多。我用你所擁有的方式看到它,你需要一個「長switch聲明」某處。也許最徹底的方法是在消息發送自己與類似的簽名:

- (ABPropertyID)recordPropertyFromMyEnum:(MyEnumType)property

考慮一下:如果你擁有的唯一枚舉排隊一個換一個與ABPropertyID,爲什麼不改用ABPropertyID

+0

因爲這些屬性在數據到達我之前的某個時間點是人類可讀的。我正在解析包含「First Name」和「Job Title」等字段的聯繫人列表。我需要能夠將它們解析爲Cocoa'kABPerson ... Property'。做一個大的Switch語句似乎是無效的,儘管你可能是對的;這可能是唯一的方法。 – Andrew 2010-03-14 00:12:15