将ABRecordID转换为NSNumber始终为-1

时间:2015-06-05 15:39:27

标签: ios swift core-data nsnumber abpeoplepickerview

我正在尝试将现有联系人的ABRecordID从通讯簿保存到核心数据中。我在我的模型中定义了Int32,但为了保存我的对象,我需要将ABRecordID(这是一个Int32)转换为NSNumber

以下是我的代码转换它:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
    let multiValue: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue()
    let index = ABMultiValueGetIndexForIdentifier(multiValue, identifier)
    let pickedVal = ABMultiValueCopyValueAtIndex(multiValue, index).takeRetainedValue() as! String

    let theRecord = recordIdFromPersonRecord(person)
    println(ABRecordGetRecordID(person!))

func recordIdFromPersonRecord (personRecord: ABRecord) -> NSNumber {
    let recordId = ABRecordGetRecordID(personRecord)
    println(personRecord)
    return (NSNumber(int: recordId))
}

无论我在地址簿中选择什么记录,此代码始终在控制台中打印-1。我是一名新手程序员,我完全陷入困境。

感谢您的帮助!

修改 下面的评论者表示这是为地址簿数据库中不存在的记录保留的值...

这令人困惑。我只是浏览AB以获取现有记录中的名称值和ID ...现有记录如何将记录保存到地址簿数据库中?以下是文档中的定义:具有此ID的记录尚未保存到通讯簿数据库中。我误会了吗?

1 个答案:

答案 0 :(得分:0)

在iOS 8中,您可以在没有请求地址簿权限的情况下浏览联系人(例如,因为您可能允许用户执行默认操作并将实际数据返回到应用程序)。但要真正了解联系人的详细信息,您必须明确请求允许这样做。

您似乎必须使用AddressBookUI.framework来呈现联系人UI,但从未要求获得访问该联系人详细信息的许可。