实现步骤及代码
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// 1. 创建一个联系人选择控制器
let pvc = ABPeoplePickerNavigationController()
// 1.1 设置代理, 接收用户的点击
pvc.peoplePickerDelegate = self
// 2. 直接弹出
presentViewController(pvc, animated: true, completion: nil)
}
extension ViewController: ABPeoplePickerNavigationControllerDelegate {
// 点击取消按钮的时候
func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController) {
print("取消")
}
// 选择某个联系人的时候
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord) {
print("选择某个联系人的时候")
// ABRecord, 一个联系人对象
// 如果想要从这个对象里面, 获取值, 应该使用一个函数进行获取ABRecordCopyValue
// 参数1: 记录
// 参数2: 属性名
let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as! String
let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() as! String
print(firstName, lastName)
// Unmanaged<AnyObject>!
// swift使用corefoundation框架里面的函数创建的对象分为两种
// 1. 内存托管对象, 不需要我们程序员处理
// 2. 内存非托管对象, 就必须要求我们程序员处理
// takeRetainedValue(): 会对接受到的对象, 进行一次引用 create copy
// takeUnretainedValue(): 会对接受到的对象, 不会进行一次引用 get
// 取出电话号码 多值属性 (标签+值) ABMultiValueRef
// 关于一个联系人记录里面的属性, 分为, 简单属性, 复杂属性(多值属性),
let phoneNums = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue() as ABMultiValueRef
// 遍历电话号码(获取多值属性里面的个数)
let count = ABMultiValueGetCount(phoneNums)
for i in 0..<count {
// 每次循环, 都是一个电话号码记录(标签+值)
let label = ABMultiValueCopyLabelAtIndex(phoneNums, i).takeRetainedValue()
let value = ABMultiValueCopyValueAtIndex(phoneNums, i).takeRetainedValue() as! String
print(label, value)
}
}
// 选择某个联系人里面的某个属性时调用
// 并且, 注意, 一定要把上面的额方法, 注释掉
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
print("选择某个联系人某个属性时的时候")
}