Я пытаюсь реализовать функцию func personViewController(personViewController: ABPersonViewController!,
shouldPerformDefaultActionForPerson person: ABRecord!,
property property: ABPropertyID,
identifier valueIdentifier: ABMultiValueIdentifier) -> Bool
, которая является частью протокола ABPersonViewControllerDelegate
и вызывается всякий раз, когда пользователь щелкает элемент в ABPersonViewController
, так что любая информация, которую выбирает пользователь, будет скопирована в словарь [String : String]
, так что имя свойства будет ключом для значения свойства: скажем, [..."kABPersonFirstNameProperty" : "Alexander"...]
.
Я также хочу избежать переключения или длинного списка условий, проверяющих, является ли свойство тем или иным; Я бы предпочел обрабатывать его как можно более широко — я пытаюсь только для двух разных случаев: если свойство является одним значением или несколькими значениями. Если это многозначное значение, я хотел бы скопировать всю доступную информацию.
Например, если пользователь нажмет на адрес, результат может быть таким: [..."kABPersonAddressStreetKey" : "1 Infinite Loop", "kABPersonAddressCityKey" : "Cupertino" , "kABPersonAddressStateKey", "California (or CA?)"...]
.
Это все, что у меня есть после нескольких часов изучения библиотеки разработчиков Apple и связанных с этим вопросов SO (жалко, я знаю):
func personViewController(personViewController: ABPersonViewController!,
shouldPerformDefaultActionForPerson person: ABRecord!,
property property: ABPropertyID,
identifier valueIdentifier: ABMultiValueIdentifier) -> Bool {
s["kABPersonFirstNameProperty"] = ABRecordCopyValue(person, kABPersonFirstNameProperty) as! String //the name can't actually be selected by the user, but I want to capture it anyway
s["kABPersonLastNameProperty"] = ABRecordCopyValue(person, kABPersonLastNameProperty) as! String
if valueIdentifier == 0 { //property is a single property, not a multivalue property
let record = ABRecordCopyValue(person, property)
s[property as! String!] = record as! String
} else { //property is an ABMultiValue
let multiRecord = ABRecordCopyValue(person, property) as! ABMultiValueRef
s[property as! String] = ABMultiValueGetIndexForIdentifier(multiRecord, valueIdentifier)
}
return false
}
Я могу сказать, что не хватает многих частей — возможно ли вообще сжать это в словарь?
Заранее спасибо (и 100 репутации тому, кто предоставит полный и правильный ответ).