Как использовать Key Value Coding для установки значений свойств в ABPerson - PullRequest
2 голосов
/ 24 февраля 2010

Учитывая эту пару ключ / значение:
FirstName = "Steve"

Я бы хотел установить свойство ABPerson в адресной книге iPhone следующим образом: ABRecordSetValue(person, kABPersonFirstNameProperty, @"Steve", nil);

Проблема в том, что я не всегда буду знать, какой ключ отправлен. (Это будет эквивалентно константе свойства без «kABPerson» перед ним и «Property» после него). Отправленный ключ может иметь любое количество свойств: «JobTitle», «Note» и т. Д. Как перевести этот ключ в константу свойства адресной книги. то есть:
FirstName to kABPersonFirstNameProperty.

Я думал, что смогу использовать Key Value Coding, но я не знаю, как реализовать это в этом случае.

Ради эффективности кодирования я стараюсь избегать использования длинного оператора Switch или массива, заполненного каждым возможным свойством.

Обновление

Я обнаружил, что мне нужно получить доступ к константе по ее строковому представлению. Но я не знаю, возможно ли это. Так что kABPersonJobTitleProperty - это константа, равная 18. Поэтому я хотел бы, чтобы следующий код работал: NSString *fieldName = [NSString stringWithString:@"JobTitle"]; NSString *propertyName = [NSString stringWithFormat:@"kABPerson%@Property", fieldName];</p> <p>ABRecordRef person = ABPersonCreate(); ABRecordSetValue(person, propertyName, @"Fisherman", nil);

Конечно, выполнение этого возвращает это предупреждение Передача аргумента 2 'ABRecordSetValue' делает целое число из указателя без приведения . Поскольку строка propertyName не преобразуется в целое число или константу, которую она ищет.

Может кто-нибудь увидеть способ сделать эту работу?

Моя настройка аналогична приведенному здесь вопросу:
Кодирование значения ключа

Я получаю XML-данные, которые я контролирую, и превращаю их в свойства записи адресной книги.

1 Ответ

2 голосов
/ 25 февраля 2010

Это больше вопрос дизайна приложения, чем что-либо еще. С моей точки зрения, вам понадобится «длинное switch заявление» где-то. Возможно, самым чистым способом будет сообщение, которое вы отправляете себе с подписью, например:

- (ABPropertyID)recordPropertyFromMyEnum:(MyEnumType)property

Учтите это: если единственные перечисления, которые у вас есть, выстраиваются один в один с ABPropertyID, почему бы просто не использовать ABPropertyID вместо этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...