【发布时间】:2015-10-27 15:04:46
【问题描述】:
我正在尝试实现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?)"...]。
这就是我所拥有的,经过几个小时的搜索苹果开发者库和相关的 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 声望提供完整、正确答案的人)。
【问题讨论】:
-
正是我正在寻找的东西......当谈到 AB 世界时,Apple 资源似乎很稀少(和 Objective-C-y)。
标签: swift dictionary abaddressbook abpersonviewcontroller abrecord