我正在尝试实现该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 Developer Library 和相关的 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 声望提供完整、正确答案的人)。